我一直在试图找出一个在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格式的数据。

任何建议都将不胜感激。


当前回答

下面的代码片段将有助于将数据转换为JSON。所有单引号都应该转换为双引号以jsonify数据。

data = {
"http://example.org/about": {
    "http://purl.org/dc/terms/title": [{
        "type": "literal",
        "value": "Anna's Homepage"
    }]
}}
parsed_data = data.replace("'", '"')
data_json = json.loads(parsed_data)

其他回答

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。在将消息放入队列之前转储。 因此接收组件生成的JSON字符串是单引号。这就导致了错误

 Expecting property name enclosed in double quotes

添加json。转储开始创建正确格式的JSON &解决问题。

解决方案1(非常危险)

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

parsed_json = eval(your_json)

方案2(无风险)

你可以使用python默认包含的ast库,它也可以安全地计算表达式。

import ast

parsed_json = ast.literal_eval(your_json)

json语法要求每个“键”和“值”都使用引号。这使得它成为一种非常健壮的数据格式。在下面的例子中,我使用颜色和颜色作为键:

{"colors":[
  {
     "color":"red",
     "value":"#f00"
  },
  {
     "color":"green",
     "value":"#0f0"
  },
  {
     "color":"blue",
     "value":"#00f"
  },
  {
     "color":"cyan",
     "value":"#0ff"
  },
  {
     "color":"magenta",
     "value":"#f0f"
  },
  {
     "color":"yellow",
     "value":"#ff0"
  },
  {
     "color":"black",
     "value":"#000"
  }]}

你输入的似乎是一个有效的(亚马逊)离子,虽然不是json。在这种情况下,您应该能够将其解析为ion,然后将其输出为json。

single_quote_json = {'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
    
import amazon.ion.simpleion as ion
from amazon.ion.json_encoder import IonToJSONEncoder

parsed_ion = ion.loads(str(single_quote_json))
json.dumps(parsed_ion, cls=IonToJSONEncoder)

输出:

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

参考:Amazon Ion上的文档:https://amzn.github.io/ion-docs/guides/cookbook.html#down-converting-to-json