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

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

到后端,它将作为一个字符串接收,然后我使用json.loads(数据)来解析它。

但每次我都得到相同的异常:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

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

任何建议都将不胜感激。


当前回答

你可以使用json5包https://pypi.org/project/json5/而不是json包。这个包可以处理单引号。解码函数是json5.loads(data),类似于json包。

其他回答

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

s = s.replace("\'", "\"")

如果你的JSON包含转义单引号(\'),那么你应该使用更精确的以下代码:

import re
p = re.compile('(?<!\\\\)\'')
s = p.sub('\"', s)

这将把JSON字符串s中出现的所有单引号替换为双引号,在后一种情况下,不会替换转义的单引号。

你也可以使用不那么严格的js-beautify:

$ pip install jsbeautifier
$ js-beautify file.js

你可以使用json5包https://pypi.org/project/json5/而不是json包。这个包可以处理单引号。解码函数是json5.loads(data),类似于json包。

我使用了这种方法,并设法获得了所需的输出。我的脚本

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"

x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

输出

>>> 0
x = x.replace("'", '"')
j = json.loads(x)

虽然这是正确的解决方案,但如果存在这样的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}}}}

注意到“真实”的价值了吗?使用这个函数可以对布尔值进行双重检查。这将涵盖这些情况

x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"')
j = json.loads(x)

另外,确保你没有做出

x = json.loads(x)

它必须是另一个变量。

我检查了你的JSON数据

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

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

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'

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

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