【问题标题】:Python parsing JSON with escaped double quotes [duplicate]Python用转义双引号解析JSON [重复]
【发布时间】:2015-09-22 22:59:49
【问题描述】:

考虑这个有效的 json:

{"a": 1, "b": "{\"c\":2}"}

Python 的 json 模块在我尝试解析它时抛出 - 看起来 \" 正在抛出它:

json.loads('{"a": 1, "b": "{\"c\":2}"}') 回溯(最近一次通话最后): 文件“”,第 1 行,在 加载中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py”,第 338 行 返回 _default_decoder.decode(s) 解码中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py”,第 365 行 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py”,第 381 行,在 raw_decode obj, end = self.scan_once(s, idx) ValueError:预期,分隔符:第 1 行第 15 列(字符 14)

有没有办法在 Python 中解析这个,无论是使用 json 模块还是其他一些模块,如 ujson

【问题讨论】:

    标签: python json encoding


    【解决方案1】:

    实际上,转义双引号并不重要。看我的测试:

    >>> json.loads('{"a": 1, "b": "{\"c\":2}"}')
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
      File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib/python3.4/json/decoder.py", line 359, in raw_decode
        obj, end = self.scan_once(s, idx)
    ValueError: Expecting ',' delimiter: line 1 column 18 (char 17)
    
    >>> json.loads('{"a": 1, "b": "{"c":2}"}')
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
      File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib/python3.4/json/decoder.py", line 359, in raw_decode
        obj, end = self.scan_once(s, idx)
    ValueError: Expecting ',' delimiter: line 1 column 18 (char 17)
    
    >>> json.loads('{"a": 1, "b": {"c":2}}')
    {'a': 1, 'b': {'c': 2}}
    
    >>> json.loads('{"a": 1, "b": {\"c\":2}}')
    {'a': 1, 'b': {'c': 2}}
    
    >>> 
    

    【讨论】:

      【解决方案2】:

      在带引号的字符串中,\" 被视为与常规引号相同:

      >>> '{"a": 1, "b": "{\"c\":2}"}'
      '{"a": 1, "b": "{"c":2}"}'
      

      因此,您的字符串不是有效的 JSON。

      您还需要转义反斜杠,以便将它们发送到loads。您可以通过使用dumps 对所需的字典进行编码来查看这一点:

      >>> json.dumps({"a": 1, "b": "{\"c\": 2}"})
      '{"a": 1, "b": "{\\"c\\": 2}"}'
      
      >>> json.loads('{"a": 1, "b": "{\\"c\\": 2}"}')
      {u'a': 1, u'b': u'{"c": 2}'}
      

      【讨论】:

      • 或使用原始字符串文字:json.loads(r'{"a": 1, "b": "{\"c\":2}"}').
      猜你喜欢
      • 1970-01-01
      • 2019-12-26
      • 2021-11-11
      • 2018-07-03
      • 2022-01-22
      • 2015-10-16
      • 2017-01-14
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多