Python/Json:期望用双引号括起来的属性名称

rae*_*aeX 63 python parsing json

我一直在试图找出一种在Python中加载JSON对象的好方法.我发送这个json数据:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
Run Code Online (Sandbox Code Playgroud)

到后端它将作为字符串接收,然后我用来json.loads(data)解析它.

但每次我得到同样的例外:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索它,但除了这个解决方案似乎没有什么工作,这个解决方案json.loads(json.dumps(data))对我来说并不那么有效,因为它接受任何类型的数据,即使是那些不是json格式的数据.

任何建议将不胜感激.

Elm*_*lmo 105

这个:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
Run Code Online (Sandbox Code Playgroud)

不是JSON.
这个:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
Run Code Online (Sandbox Code Playgroud)

是JSON.

  • 这不是一个解决方案。解决方案会告诉他如何将字符串修改为有效的 json。 (118认同)
  • @ElmoVanKielmo 并没有改变你的答案是一个陈述,而不是问题的答案这一事实。您没有提供上下文或解释。来这里寻找有关该问题的信息的人将会感到失望。你可能帮助了OP,但其他人却没有那么多。 (16认同)
  • 简单明了的陈述通常会有很大帮助。特别是当周围有很多其他答案时。 (6认同)
  • @FistOfFury,我很抱歉,但您的声明基于一个错误的假设,即可以通过编程方式将任意无效的 JSON 字符串可靠地转换为有效的字符串。这个问题的很多答案都试图通过将 ' 替换为 " 等来解决这个问题。我是否必须给你提供简单的输入字符串示例来破坏这些“解决方案”?显然 OP 明白我们正在处理的不是JSON 并能够继续 - 接受了我的答案。提示 - 输入字符串看起来更像是 Python dict.__repr__() 方法的输出。 (4认同)
  • Thanx :)我没有注意这一点,我在发送数据时使用了正确的json格式,但是当在后端接收到数据时,双引号将被单引号代替!因此我得到了例外。 (3认同)

eli*_*lig 27

因为JSON只允许用双引号括起字符串,所以你可以像这样操作字符串:

str

这将在JSON字符串中用双引号替换所有出现的单引号js-beautify.

您也可以使用str不太严格的: js-beautify

  • 这不是一个好主意,因为它可以将所有 's 替换为 "s,这是错误的:示例:'it's bad' -> "it"s bad" -> 格式错误的字符串 (9认同)
  • @Reihan_amn 对于使用转义单引号的情况,我添加了更精确的正则表达式替代方案。 (3认同)

小智 19

import ast

inpt = {'http://example.org/about': {'http://purl.org/dc/terms/title':
                                     [{'type': 'literal', 'value': "Anna's Homepage"}]}}

json_data = ast.literal_eval(json.dumps(inpt))

print(json_data)
Run Code Online (Sandbox Code Playgroud)

这将解决问题。

  • 这应该更高,因为它实际上回答了问题。 (22认同)
  • 就是这样。 (8认同)

Aka*_*jan 9

如果你想将带有单引号的 json 字符串转换为 python dict 使用ast.literaleval()

>>> import ast
>>> payload = "{'hello': 'world'}"
>>> ast.literal_eval(payload)
{'hello': 'world'}
>>> type(ast.literal_eval(payload))
<class 'dict'>
Run Code Online (Sandbox Code Playgroud)

这会将有效负载转换为 python 字典。


Ujj*_*wal 8

您可以简单地使用 python eval 函数。

parsed_json = eval(your_json)
Run Code Online (Sandbox Code Playgroud)

  • 或者甚至“ast.literal_eval”“安全地评估表达式节点或包含Python表达式的字符串”。 (4认同)

Yar*_*ron 7

我检查了你的 JSON 数据

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
Run Code Online (Sandbox Code Playgroud)

http://jsonlint.com/ 中,结果是:

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'
Run Code Online (Sandbox Code Playgroud)

将其修改为以下字符串可解决 JSON 错误:

{
    "http://example.org/about": {
        "http://purl.org/dc/terms/title": [{
            "type": "literal",
            "value": "Anna's Homepage"
        }]
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的链接! (3认同)

Dan*_*man 6

很简单,该字符串不是有效的JSON。如错误所述,JSON文档需要使用双引号。

您需要修复数据源。

  • 如果您无法控制数据来源,该怎么办?... (4认同)

ale*_*lay 6

JSON字符串必须使用双引号.JSON python库强制执行此操作,因此您无法加载字符串.您的数据需要如下所示:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
Run Code Online (Sandbox Code Playgroud)

如果这不是你可以做的事情,你可以用ast.literal_eval()而不是json.loads()

  • 这不是Python库的限制,而是JSON格式本身的限制. (3认同)
  • 如果 JSON 字符串具有布尔值,则使用 `ast.literal_eval` 将导致 `ValueError: malformed string`。 (2认同)

gre*_*tec 6

就我而言,双引号不是问题。

上一个逗号给了我同样的错误信息。

{'a':{'b':c,}}
           ^
Run Code Online (Sandbox Code Playgroud)

为了删除该逗号,我编写了一些简单的代码。

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)
Run Code Online (Sandbox Code Playgroud)

这对我有用。

  • +1 我可以确认这一点。尾随逗号确实会产生此错误消息。示例: `echo '{"json":"obj",}' | python -m json.tool` 在 shell 中运行时,给出“期望用双引号括起来的属性名称:第 1 行第 15 列(字符 14)”。尾随逗号不是合法的 JSON,但如果 Python JSON 模块在这种情况下发出相关错误消息,那就太好了。 (4认同)

Tob*_*nst 6

您可以使用json5https://pypi.org/project/json5/而不是jsonpackage.json。这个包可以处理单引号。解码功能json5.loads(data)json封装类似。


Ami*_*osh 5

x = x.replace("'", '"')
j = json.loads(x)
Run Code Online (Sandbox Code Playgroud)

虽然这是正确的解决方案,但是如果有这样的 JSON 可能会导致相当头痛 -

{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}
Run Code Online (Sandbox Code Playgroud)

注意到“True”值了吗?使用它可以对布尔值进行双重检查。这将涵盖这些情况 -

x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"')
j = json.loads(x)
Run Code Online (Sandbox Code Playgroud)

另外,请确保您不会

x = json.loads(x)
Run Code Online (Sandbox Code Playgroud)

它必须是另一个变量。