我无法使用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)
我非常确定错误发生在第2行到最后一行
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
但我不知道该怎么做才能修复它。任何建议将不胜感激。
答案 0 :(得分:145)
我遇到了另一个返回相同错误的问题。
我使用带有单引号的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
可以通过插入JSON(如Python字典)来防止单引号和最终逗号问题(因此您必须遵循Python字典语法)。对于文字结构,它是eval()
函数的一个非常好且安全的替代。
Python documentation警告我们使用大/复杂的字符串:
带有单引号的警告可能会使Python解释器崩溃 由于堆栈深度限制,足够大/复杂的字符串 Python的AST编译器。
要轻松使用json.dumps
单引号,您可以使用以下代码:
import ast
import json
data = json.dumps(ast.literal_eval(json_data_single_quote))
ast
文档如果您经常编辑JSON,则可以使用CodeBeautify。它可以帮助您修复语法错误并缩小/美化JSON。
我希望它有所帮助。
答案 1 :(得分:73)
json.loads
会将json字符串加载到python dict
中,json.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
应该<type 'str'>
,所以该行不正确。
因此,如果您正在尝试加载json,则应该将正在加载的内容更改为上面的json_string
,否则您应该将其转储。这是我对给定信息的最佳猜测。你想要完成的是什么?
此外,您无需在字符串前指定u
,如评论中提到的@Cld。
答案 2 :(得分:7)
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))
答案 3 :(得分:3)
所有其他答案可能会回答您的问题,但我遇到了同样的问题,这是由于我在json字符串末尾添加的迷路,
所致:
{
"key":"123sdf",
"bus_number":"asd234sdf",
}
当我删除这样的额外,
时,我终于开始工作了:
{
"key":"123sdf",
"bus_number":"asd234sdf"
}
希望这有帮助!欢呼声。
答案 4 :(得分:0)
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'}]
答案 5 :(得分:0)
遇到这种情况的另一种情况是,当我使用echo
将JSON传递到我的python脚本中并且粗心地将JSON字符串用双引号引起来时:
echo "{"thumbnailWidth": 640}" | myscript.py
请注意,JSON字符串本身带有引号,我应该这样做:
echo '{"thumbnailWidth": 640}' | myscript.py
实际上,这是python脚本收到的内容:{thumbnailWidth: 640}
;有效地删除了双引号。