自动插入反斜杠以使用双引号解析json字符串

时间:2017-01-24 22:25:35

标签: python json

以下是需要解析的json字符串示例 -

'{ 
"name":"bla",
"quote":"bla bla "blah blah" bla",
"occupation":"blabla"
}'

我需要自动插入\\转义两个引号进行解析。我跟着this。但问题是,它将字符串拆分为:,因为它假定json字符串只有一个键值。此外,我也无法按,拆分,因为quote部分的文字中可能包含,。例如"quote":"bla bla, "blah blah" bla"。因此,与答案相反,我需要一个更强大的解决方案。我怎样才能做到这一点?我无法想到对该答案的任何修改,这在我的案例中将完美地发挥作用。

2 个答案:

答案 0 :(得分:2)

这绝对是一个格式错误的json,并且没有强大的解析方法来覆盖所有可能的情况。

如果您知道这是每一行的结构,您可以尝试以更复杂的方式进行拆分,例如":",但这不可靠。另一种方法是使用正则表达式,但它更复杂,可能会遇到同样的问题。

最好的解决方案是去创建这个JSON的人,打他的脸,然后让他重新编码文件,但我想这不可能是atm。

答案 1 :(得分:0)

鉴于两个(相当大)的前提,它仍然可以被解析:

  1. {},& :不是任何字段的有效值
  2. 每个条目{}有3个部分
  3. 如果您在数字变化时概括了键/值对的解析,则可以删除

    2。

    1也可以轻微放松,如果您可以说:只能 出现在值字段中(任意数量)。 This would be mutually exclusive to #2, however.

    正则表达式:

    {\"([^\"]*)\":\"([^:\n\r]*)\",?\"([^\"]*)\":\"([^:\n\r]*)\",?\"([^\"]*)\":\"([^:\n\r]*)\",?}
    

    或者,作为原始字符串:

    r'{"([^"]*)":"([^:\n\r]*)",?"([^"]*)":"([^:\n\r]*)",?"([^"]*)":"([^:\n\r]*)",?}'
    

    regex101

    注意:这不会处理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'}