我在使用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})
但我不知道该怎么办。如果有任何建议,我将不胜感激。
我遇到了另一个返回相同错误的问题。
单报价问题
我使用了一个带有单引号的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 dictionary来防止单引号和最后的逗号问题(因此您必须遵循Python dictionnary语法)。对于文本结构,它是eval()
函数的一个非常好且安全的替代方案。
Python文档警告我们不要使用大型/复杂字符串:
警告使用由于中的堆栈深度限制,字符串足够大/复杂Python的AST编译器。
带有单引号的json.dumps
要使用带有单引号的json.dumps
,您可以使用以下代码:
import ast
import json
data = json.dumps(ast.literal_eval(json_data_single_quote))
ast
文档
ast Python 3文档
ast Python 2文档
工具
如果您经常编辑JSON,您可以使用CodeBeautify。它可以帮助您修复语法错误并缩小/美化JSON。
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在注释中提到的那样。
- 将所有单引号替换为双引号
- 将字符串中的"u"替换为"。。。因此,在将字符串加载到json之前,基本上将内部unicode转换为字符串
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))
所有其他答案都可能回答您的查询,但我遇到了同样的问题,这是由于我在json字符串末尾添加了杂散,
,如下所示:
{
"key":"123sdf",
"bus_number":"asd234sdf",
}
当我移除额外的,
时,我终于让它工作了,就像这样:
{
"key":"123sdf",
"bus_number":"asd234sdf"
}
希望得到帮助!干杯
使用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'}]
我遇到这种情况的另一种情况是,我使用echo
将JSON管道传输到我的python脚本中,并不小心将JSON字符串用双引号括起来:
echo "{"thumbnailWidth": 640}" | myscript.py
注意,JSON字符串本身有引号,我应该这样做:
echo '{"thumbnailWidth": 640}' | myscript.py
事实上,这就是python脚本接收到的内容:{thumbnailWidth: 640}
;双引号实际上被去掉了。