【问题标题】:Python json.loads ValueError, expecting delimiterPython json.loads ValueError,需要分隔符
【发布时间】:2023-04-06 00:50:01
【问题描述】:

我将一个 postgres 表提取为 json。输出文件包含如下行:

{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}

现在我需要使用json.loads 将它们加载到我的python 代码中,但是我收到了这个错误:

Traceback (most recent call last):
  File "test.py", line 33, in <module>
    print json.loads('''{"id": 4, "data": {"test": 1, "hello": "I have \" !"}}''')
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 50 (char 49)

我发现解决方法是将另一个\ 添加到\"。所以,如果我通过了

{"data": {"test": 1, "hello": "I have \\" !"}, "id": 4}

json.loads,我明白了:

{u'data': {u'test': 1, u'hello': u'I have " !'}, u'id': 4}

有没有办法在不添加额外的\ 的情况下做到这一点?比如向json.loads 传递参数之类的?

【问题讨论】:

  • 嘿伙计们,我有同样的问题任何有效的解决方案?

标签: python json python-2.7


【解决方案1】:

试试这个:

json.loads(r'{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}')

如果您在变量中包含该字符串,那么只需:

json.loads(data.replace("\\", r"\\"))

希望对你有帮助!

【讨论】:

  • 恐怕不行,'{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}''{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}'.replace("\\", r"\\")一模一样。
  • @AliBZ 它不起作用,因为您在字符串之前缺少r。复制并粘贴我的第一个示例,这样就可以了。
  • 我的字符串在一个变量中,这就是我使用你的第二个例子的原因。
  • @AliBZ 好的,所以唯一的方法是使用replace手动将"替换为\\"
【解决方案2】:

您可以指定所谓的“原始字符串”:

>>> print r'{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}'
{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}

他们不解释反斜杠。

通常的字符串将\" 更改为",因此您可以在字符串中包含" 字符,这些字符本身由双引号限制:

>>> "foo\"bar"
'foo"bar'

所以从\"" 的转换不是由json.loads 完成的,而是由Python 本身完成的。

【讨论】:

  • 我正在逐行读取数据文件。所以我有变量中的字典。我试过.replace("\\", r"\\").encode('string-escape'),都不管用。
  • 在 JSON 中 "\"" 也意味着 '"',就像在 Python 中一样。如果输入文件中有\",它实际上是"。如果您出于某种原因想要拥有r'\"',则需要.replace('"', '\\"')
【解决方案3】:

试试source.replace('""', '')或者sub的方式,因为源中的""会让json.loads(source)无法区分。

【讨论】:

    【解决方案4】:

    以我为例,我写道:

    STRING.replace("': '", '": "').replace("', '", '", "').replace("{'", '{"').replace("'}", '"}').replace("': \"", '": "').replace("', \"", '", "').replace("\", '", '", "').replace("'", '\\"')
    

    并且像魅力一样工作。

    【讨论】:

    • 我不知道,为什么你投了反对票。我试过你的,它奏效了。
    【解决方案5】:

    尝试使用三引号 r""",不需要考虑 \ 的东西。

    json_string = r"""
    {
        "jsonObj": []
    }
    """
    data = json.loads(json_string)
    

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2018-08-07
      • 2022-11-02
      • 2018-10-18
      相关资源
      最近更新 更多