JSON ValueError:期望的属性名称:第1行第2列(字符1)


97

我在使用json.loads转换为dict对象时遇到麻烦,我无法弄清楚我在做什么错。我得到的确切错误是

ValueError: Expecting property name: line 1 column 2 (char 1)

这是我的代码:

from kafka.client import KafkaClient
from kafka.consumer import SimpleConsumer
from kafka.producer import SimpleProducer, KeyedProducer
import pymongo
from pymongo import MongoClient
import json

c = MongoClient("54.210.157.57")
db = c.test_database3
collection = db.tweet_col

kafka = KafkaClient("54.210.157.57:9092")

consumer = SimpleConsumer(kafka,"myconsumer","test")
for tweet in consumer:
    print tweet.message.value
    jsonTweet=json.loads(({u'favorited': False, u'contributors': None})
    collection.insert(jsonTweet)

我很确定错误发生在第二行到最后一行

jsonTweet=json.loads({u'favorited': False, u'contributors': None})

但我不知道该如何解决。任何意见,将不胜感激。


3
您在那看到语法错误吗?流浪者"是复制粘贴错误吗?
karthikr 2014年

该行打印出的JSON字符串是什么print tweet.message.value
路加·伍德沃德2014年

1
ValueError是因为在JSON输入,而不是在你的代码中的问题的错误的发送。(除了缺少"谁应该正常发送SyntaxError,所以我认为它只是一个复制粘贴错误。)
卡尔-费舍尔

(顺便说一句,utf_8是json.loads的默认编码,因此无需指出。)
Cld

感谢您的输入。编辑了问题,现在应该更清楚了。
2014年

Answers:


83

json.loads将json字符串加载到python中dictjson.dumps将python转储dict到json字符串中,例如:

>>> json_string = '{"favorited": false, "contributors": null}'
'{"favorited": false, "contributors": null}'
>>> value = json.loads(json_string)
{u'favorited': False, u'contributors': None}
>>> json_dump = json.dumps(value)
'{"favorited": false, "contributors": null}'

所以那行是不正确的,因为您正在尝试load使用python dict,并json.loads期望json string应该有一个有效的python <type 'str'>

因此,如果您尝试加载json,则应更改要加载的内容,使其类似于json_string上面的内容,否则应将其转储。根据给定的信息,这只是我的最佳猜测。您要完成什么?

另外,您也不需要u在字符串前指定,就像注释中提到的@Cld一样。


2
json.loads会将-> json对象<-加载到python字典中 -这与文档所说的甚至您自己的代码相反-您在字符串而不是json上使用load()对象
18st

是的@ 7stud,您是对的,它正在加载字符串。但是它必须是有效的json字符串。我已经更新了答案。
Yep_It's_Me

186

我遇到另一个返回相同错误的问题。

单引号

我使用带单引号的json字符串:

{
    'property': 1
}

但是json.loads只接受json属性的双引号

{
    "property": 1
}

最终逗号问题

json.loads 不接受最终逗号:

{
  "property": "text", 
  "property2": "text2",
}

解决方案:ast解决单引号和最终逗号问题

您可以使用ast(Python 2和3的标准库的一部分)进行此处理。这是一个例子:

import ast
# ast.literal_eval() return a dict object, we must use json.dumps to get JSON string
import json

# Single quote to double with ast.literal_eval()
json_data = "{'property': 'text'}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with double quotes
json_data = '{"property": "text"}'
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with final coma
json_data = "{'property': 'text', 'property2': 'text2',}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property2": "text2", "property": "text"}

使用ast会像Python字典一样插入JSON,从而避免出现单引号和最终逗号问题(因此,您必须遵循Python字典语法)。它是eval()文字结构函数的一种非常不错且安全的替代方法。

Python文档警告我们使用大/复杂字符串:

警告由于Python AST编译器中的堆栈深度限制,使用足够大/复杂的字符串可能会使Python解释器崩溃。

带有单引号的json.dumps

json.dumps轻松使用单引号,可以使用以下代码:

import ast
import json

data = json.dumps(ast.literal_eval(json_data_single_quote))

ast 文件资料

ast Python 3 doc

ast Python 2文档

工具

如果您经常编辑JSON,则可以使用CodeBeautify。它可以帮助您修复语法错误并缩小/美化JSON。

希望对您有所帮助。


10
  1. 用双引号替换所有单引号
  2. 将字符串中的'u“'替换为'”'...因此,在将字符串加载到json之前,基本上将内部unicodes转换为字符串
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))

1
更多的Python方法是使用ast.literal_eval(“ {u'key':u'val'}”)。它将解决所有与格式有关的问题
Vinay Pande

json。 “ /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py”,第338行,在负载中返回_default_decoder.decode(s)obj,end = self.scan_once(s ,idx)ValueError:预期属性名称:第1行第2列(字符1)
Sanjay Pradeep

4

所有其他答案都可以回答您的查询,但是我遇到了同样的问题,这是由于,我在json字符串的末尾添加了这样的杂散:

{
 "key":"123sdf",
 "bus_number":"asd234sdf",
}

当我,像这样删除多余的东西时,我终于使它工作了:

{
 "key":"123sdf",
 "bus_number":"asd234sdf"
}

希望有帮助!干杯。



@fedorqui这部分是在我的回答之后添加的(stackoverflow.com/posts/36599122/revisions)现在,您可能想给+1 :)
Rishabh Agrahari,

1
哦,你是对的!它是在2018年1月之前添加的。致歉并+1 :)
fedorqui'SO停止伤害

0

使用ast,例如

In [15]: a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
...:      {'start_city': '2', 'end_city': 'bbb', 'number': 1},\
...:      {'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
In [16]: import ast
In [17]: ast.literal_eval(a)
Out[17]:
[{'end_city': 'aaa', 'number': 1, 'start_city': '1'},
 {'end_city': 'bbb', 'number': 1, 'start_city': '2'},
 {'end_city': 'ccc', 'number': 1, 'start_city': '3'}]

0

我遇到的另一种情况是,当我使用echoJSON将其通过管道传递到python脚本中,并且不小心将JSON字符串用双引号引起来时:

echo "{"thumbnailWidth": 640}" | myscript.py

请注意,JSON字符串本身带有引号,我应该这样做:

echo '{"thumbnailWidth": 640}' | myscript.py

由于这是,这是获得什么python脚本:{thumbnailWidth: 640}; 双引号已被有效删除。

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.