Python / Json:期望用双引号

时间:2016-09-14 13:13:53

标签: python json parsing

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

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

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

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

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

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

任何建议都将不胜感激。

21 个答案:

答案 0 :(得分:74)

此:

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

不是JSON 这样:

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

是JSON。

答案 1 :(得分:17)

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

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

这将在JSON字符串str中用双引号替换所有出现的单引号。

您还可以使用不太严格的js-beautify

$ pip install jsbeautifier
$ js-beautify file.js

答案 2 :(得分:6)

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

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

如果您无法做到这一点,可以使用ast.literal_eval()代替json.loads()

答案 3 :(得分:4)

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)

这将解决问题。

答案 4 :(得分:4)

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

您需要修复数据来源。

答案 5 :(得分:3)

我已检查过您的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"
        }]
    }
}

答案 6 :(得分:2)

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)

它必须是另一个变量。

答案 7 :(得分:2)

with open('input.json','r') as f:
    s = f.read()
    s = s.replace('\'','\"')
    data = json.loads(s)

这对我来说效果很好。谢谢。

答案 8 :(得分:2)

正如它错误地说的那样,名称应该用双引号括起来,而不是单引号。您传递的字符串不是有效的JSON。它应该看起来像

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

答案 9 :(得分:1)

我使用此方法并设法获得所需的输出。我的剧本

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

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

输出

>>> 0

答案 10 :(得分:1)

对于任何想要快速修复的人,这只是用双引号替换所有单引号:

import json 

predictions = []

def get_top_k_predictions(predictions_path):
    '''load the predictions'''
    
    with open (predictions_path) as json_lines_file:
        for line in json_lines_file:
            predictions.append(json.loads(line.replace("'", "\"")))
            
    
get_top_k_predictions("/sh/sh-experiments/outputs/john/baseline_1000/test_predictions.jsonl")

答案 11 :(得分:1)

如果您在将 dict 转换为字符串并使用双引号时遇到问题,这会有所帮助:

json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')

json.loads documentation

答案 12 :(得分:1)

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

parsed_json = eval(your_json)

答案 13 :(得分:0)

始终最好使用json.dumps()方法。 为了消除此错误,我使用了以下代码

json.dumps(YOUR_DICT_STRING).replace("'", '"')

答案 14 :(得分:0)

我有类似的问题。彼此通信的两个组件使用队列。

在将消息放入队列之前,第一个组件没有执行json.dumps。 因此,接收组件生成的JSON字符串是单引号。这导致了错误

 Expecting property name enclosed in double quotes

添加json.dumps开始创建格式正确的JSON&解决了问题。

答案 15 :(得分:0)

使用eval函数。

它处理单引号和双引号之间的差异。

答案 16 :(得分:0)

其他答案很好地说明了错误,因为传递给json模块的引号字符无效。

就我而言,即使在我的字符串中将'替换为"之后,我仍然继续出现ValueError。我终于意识到,有些引号形式的unicode符号已进入我的字符串中:

 “  ”  ‛  ’  ‘  `  ´  ″  ′ 

要清除所有这些,您只需将字符串通过正则表达式传递即可:

import re

raw_string = '{“key”:“value”}'

parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)

json_object = json.loads(parsed_string)

答案 17 :(得分:0)

我遇到了同样的问题,我所做的是用双引号替换单引号,但更糟糕的是,当我对 json 对象的最后一个属性使用逗号时,我遇到了同样的错误。所以在使用json.loads()函数之前,我在python中使用了regex来替换它。 (注意“loads”末尾的 s)

import re

with open("file.json", 'r') as f:
     s = f.read()
     correct_format = re.sub(", *\n *}", "}", s)
     data_json = json.loads(correct_format)

使用的正则表达式返回每个逗号后跟一个换行符和“}”,仅用“}”替换它。

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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"
  }]}

答案 20 :(得分:-1)

当手动编辑JSON时,我多次遇到此问题。 如果有人要在不注意的情况下从文件中删除某些内容,则会引发相同的错误。

例如,如果缺少JSON最后一个“}”,它将抛出相同的错误。

因此,如果您手动编辑文件,请确保按照JSON解码器的要求格式化文件,否则会遇到相同的问题。

希望这会有所帮助!