问题:JSON ValueError:期望的属性名称:第1行第2列(字符1)
我在使用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})但我不知道该如何解决。任何意见,将不胜感激。
回答 0
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应该有一个有效的python <type 'str'>。
因此,如果您尝试加载json,则应更改要加载的内容,使其类似于json_string上面的内容,否则应将其转储。根据给定的信息,这只是我的最佳猜测。您要完成什么?
另外,您也不需要u在字符串前指定,就像注释中提到的@Cld一样。
回答 1
我遇到另一个返回相同错误的问题。
单引号
我使用带单引号的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 文件资料
工具
如果您经常编辑JSON,则可以使用CodeBeautify。它可以帮助您修复语法错误并缩小/美化JSON。
希望对您有所帮助。
回答 2
- 用双引号替换所有单引号
- 将字符串中的’u“’替换为’”’…因此,在将字符串加载到json之前,基本上将内部unicodes转换为字符串
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))回答 3
所有其他答案都可以回答您的查询,但是我遇到了同样的问题,这是由于,我在json字符串的末尾添加了这样的杂散:
{
 "key":"123sdf",
 "bus_number":"asd234sdf",
}当我,像这样删除多余的东西时,我终于使它工作了:
{
 "key":"123sdf",
 "bus_number":"asd234sdf"
}希望有帮助!干杯。
回答 4
使用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'}]回答 5
我遇到的另一种情况是,当我使用echoJSON将其通过管道传递到python脚本中,并且不小心将JSON字符串用双引号引起来时:
echo "{"thumbnailWidth": 640}" | myscript.py请注意,JSON字符串本身带有引号,我应该这样做:
echo '{"thumbnailWidth": 640}' | myscript.py由于这是,这是获得什么python脚本:{thumbnailWidth: 640}; 双引号已被有效删除。

