以下是需要解析的json字符串示例 -
'{
"name":"bla",
"quote":"bla bla "blah blah" bla",
"occupation":"blabla"
}'
我需要自动插入\\
转义两个引号进行解析。我跟着this。但问题是,它将字符串拆分为:
,因为它假定json字符串只有一个键值。此外,我也无法按,
拆分,因为quote
部分的文字中可能包含,
。例如"quote":"bla bla, "blah blah" bla"
。因此,与答案相反,我需要一个更强大的解决方案。我怎样才能做到这一点?我无法想到对该答案的任何修改,这在我的案例中将完美地发挥作用。
答案 0 :(得分:2)
这绝对是一个格式错误的json,并且没有强大的解析方法来覆盖所有可能的情况。
如果您知道这是每一行的结构,您可以尝试以更复杂的方式进行拆分,例如":"
,但这不可靠。另一种方法是使用正则表达式,但它更复杂,可能会遇到同样的问题。
最好的解决方案是去创建这个JSON的人,打他的脸,然后让他重新编码文件,但我想这不可能是atm。
答案 1 :(得分:0)
鉴于两个(相当大)的前提,它仍然可以被解析:
{
,}
,& :
不是任何字段的有效值{}
有3个部分2。
1也可以轻微放松,如果您可以说:
只能 出现在值字段中(任意数量)。 This would be mutually exclusive to #2, however.
正则表达式:
{\"([^\"]*)\":\"([^:\n\r]*)\",?\"([^\"]*)\":\"([^:\n\r]*)\",?\"([^\"]*)\":\"([^:\n\r]*)\",?}
或者,作为原始字符串:
r'{"([^"]*)":"([^:\n\r]*)",?"([^"]*)":"([^:\n\r]*)",?"([^"]*)":"([^:\n\r]*)",?}'
注意:这不会处理JSON部分中的任何空格,但是如果需要可以添加它,它已经很久了/
用法:
pattern = r'{"([^"]*)":"([^:\n\r]*)",?"([^"]*)":"([^:\n\r]*)",?"([^"]*)":"([^:\n\r]*)",?}'
matches = re.findall(pattern, input)
for match in matches:
result = {match[0]: match[1], match[2]: match[3], match[4]: match[5]}
# Do something with each result
使用中:
>>> pattern = '{\"([^\"]*)\":\"([^:\n\r]*)\",?\"([^\"]*)\":\"([^:\n\r]*)\",?\"([^\"]*)\":\"([^:\n\r]*)\",?}'
>>> matches = re.findall(pattern, input)
>>> for match in matches:
result = {match[0]: match[1], match[2]: match[3], match[4]: match[5]}
>>> result
{'quote': 'bla bla "blah blah" bla', 'name': 'bla', 'occupation': 'blabla'}
另一个例子:
>>> input = """{"name":"b"testst,s'''""'''''''t""e,"la","quote":"bla bla "blah b,lah" bla","occupation":"bl,,,abla"}"""
>>> matches = re.findall(pattern, input)
>>> for match in matches:
result = {match[0]: match[1], match[2]: match[3], match[4]: match[5]}
>>> result
{'quote': 'bla bla "blah b,lah" bla', 'name': 'b"testst,s\'\'\'""\'\'\'\'\'\'\'t""e,"la', 'occupation': 'bl,,,abla'}