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


108

我一直在尝试找到一种在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格式的数据也是如此。

任何建议将不胜感激。


18
我的错误不是双引号。我在最后一个键值对之后添加了逗号,就像在python中一样。您不需要在JSON中执行此操作。
Luv33preet

4
总是使用json.dumps()而不是仅仅写出python并希望python表示法能在您的JavaScript阅读器中使用。
vy32

我遇到了这个问题,因为我采用了a的结果print(jsonpickle_deserialized_object_string)并尝试使用它。由于某些原因,print()将引号从更改"'
StingyJack '19

@ Luv33preet,谢谢,解决了它。但我期望logger-msg为缺少逗号之类的东西,但是此错误并未说明任何问题,
ganeshdeshmukh

Answers:


150

这个:

{'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。

编辑:
一些评论者建议以上是不够的。
JSON规范-RFC7159声明字符串以引号开头和结尾。那是"
单一仲裁'在JSON中没有语义,只能在字符串中使用。


4
Thanx :)我没有注意这一点,我在发送数据时使用了正确的json格式,但是当在后端接收到数据时,双引号将被单引号代替!因此,我得到了例外。
raeX

25
这不是解决方案。一个解决方案将告诉他如何将字符串修改为有效的json。
FistOfFury

2
@FistOfFury很抱歉,您的陈述是基于一个错误的假设,即任意无效的JSON字符串都可以通过编程可靠地转换为有效的字符串。这个问题的很多答案都试图通过用'代替'来解决问题,等等。我是否需要给您简单的输入字符串示例,这些示例将破坏这些“解决方案”?显然,OP理解我们正在处理的不是JSON并能够继续进行-接受了我的回答提示-输入字符串看起来更像是python dict .__ repr __()方法的输出
ElmoVanKielmo

4
@ElmoVanKielmo不会改变您的答案是陈述,而不是问题的答案这一事实。您没有提供任何上下文或解释。来这里寻找有关该问题的信息的人会很失望。您可能对OP有所帮助,但对其他人的帮助不那么多。
FistOfFury

一个简单明确的声明通常会很有帮助。特别是,当周围还有很多其他答案时。

45

因为JSON仅允许使用双引号将字符串引起来,所以您可以像这样操作字符串:

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

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

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

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

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

$ pip install jsbeautifier
$ js-beautify file.js

4
这不是一个好主意,因为它可以将所有的's替换为错误的s:示例:'it's bad'->“ it” s bad“->格式不正确的字符串
Reihan_amn

@Reihan_amn我为使用转义单引号的情况添加了更精确的正则表达式替代。
elig

33

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

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

{'a':{'b':c,}}
           ^

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

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)

这对我有用。


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

7

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

您需要修复数据源。


6

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

2
谢谢您的联系!
WolVes

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
这不是Python库的限制,而是JSON格式本身的限制。
Daniel Roseman

你是对的。但是,某些JSON解析器不会强制使用双引号。我将更新我的答案。
alexbclay16年

如果此非JSON的单引号引起来的字符串中没有任何双引号,那么您要做的就是在调用之前将所有单打替换为双打json.loads()
nigel222 '16

2
使用ast.literal_eval会导致ValueError: malformed string如果JSON字符串有一个布尔值。
Scratch'N'Purr

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)

这样可以解决问题。


3

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

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

2

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

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

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

输出

>>> 0

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

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


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

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

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

另外,请确保您不

x = json.loads(x)

它必须是另一个变量。


1

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

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

 Expecting property name enclosed in double quotes

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


0

使用eval功能。

它解决了单引号和双引号之间的差异。


永远不要在用户输入上使用eval,也不要在HTTP请求中使用数据。这是一个巨大的安全问题。
ElmoVanKielmo

0

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

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

           `  ´     

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

import re

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

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

json_object = json.loads(parsed_string)

-1

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

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

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

希望这可以帮助!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.