python3 - json.为值中包含“”的字符串加载

41ik7eoe  于 2022-11-19  发布在  Python
关注(0)|答案(3)|浏览(165)

我尝试使用json将包含dict的字符串转换为dict对象。

string = '{"key1":"my"value","key2":"my"value2"}'
js = json.loads(s,strict=False)

它输出json.decoder。必须是','分隔符号:第1行第13列(第12个字符),因为“是一个分隔符,而且它太多了
实现目标的最佳方法是什么?
我找到的解决方案是在字符串上执行几个.replace,用一个模式替换legit“,直到只剩下illgal“,然后用legit“替换回该模式,之后我可以使用json.loads,然后用非法“替换剩余的模式。但必须有另一种方法
例如:

string = '{"key1":"my"value","key2":"my"value2"}'
string = string.replace('{"','__pattern_1')
string = string.replace('}"','__pattern_2')
...
...
string = string.replace('"','__pattern_42')
string = string.replace('__pattern_1','{"')
string = string.replace('__pattern_2','}"')
...
...
js = json.loads(s,strict=False)
dgjrabp2

dgjrabp21#

我在这里所做的就是用其他的东西替换所有需要的双引号,然后删除不需要的双引号,然后再转换回来。

import re
import json

def fix_json_string(st):
    st = re.sub(r'","',"!!",st)
    st = re.sub(r'":"',"--",st)
    st = re.sub(r'{"',"{{",st)
    st = re.sub(r'"}',"}}",st)
    st = st.replace('"','')
    st = re.sub(r'}}','"}',st)
    st = re.sub(r'{{','{"',st)
    st = re.sub(r'--','":"',st)
    st = re.sub(r'!!','","',st)
    return st

broken_string = '{"key1":"my"value","key2":"my"value2"}'
fixed_string = fix_json_string(broken_string)
print(fixed_string)
js = json.dumps(eval(fixed_string))
print(js)

Output -
{"key1":"myvalue","key2":"myvalue2"} # str
{"key1": "myvalue", "key2": "myvalue2"} # converted to json
9jyewag0

9jyewag02#

变量string不是有效的JSON字符串。正确的字符串应为:

string = '{"key1":"my\\"value","key2":"my\\"value2"}'
f0ofjuux

f0ofjuux3#

问题是字符串包含无效的json格式。
字符串'{"key1": "my"value", "key2": "my"value2"}'key1的值以"my"结尾,其他字符value"与格式不符。
您可以使用字符转义,有效的json将如下所示:
{"key1": "my\"value", "key2": "my\"value2"} .
由于您将其定义为value,因此需要对转义字符进行转义:
string = '{"key1": "my\\"value", "key2": "my\\"value2"}'
网上有很多关于 * 字符转义 * 的教育材料。如果有什么不清楚的地方,我建议去看看
编辑:如果你坚持在代码中修复字符串(我不建议这样做,请参见注解),你可以这样做:

import re
import json
string = '{"key1":"my"value","key2":"my"value2"}'

# finds contents of keys and values, assuming that the key the real key/value ending double quotes 
# followed by one of following characters: ,}:]
m = re.finditer(r'"([^:]+?)"(?:[,}:\]])', string)

new_string = string

for i in reversed(list(m)):
    ss, se = i.span(1)  # first group holds the content
    # escape double backslashes in the content and add all back together
    # note that this is not effective. Bigger amounts of replacements would require other approach of concatanation 
    new_string = new_string[:ss] + new_string[ss:se].replace('"', '\\"') + new_string[se:]

json.loads(new_string)

这里假设真实的的结束双引号后面跟一个,:}]

相关问题