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

dre*_*und 88 python json pymongo

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

ValueError: Expecting property name: line 1 column 2 (char 1)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

jsonTweet=json.loads({u'favorited': False, u'contributors': None})
Run Code Online (Sandbox Code Playgroud)

但我不知道该怎么做才能解决它.任何意见,将不胜感激.

Sam*_*zon 169

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

单引号问题

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

{
    'property': 1
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "property": 1
}
Run Code Online (Sandbox Code Playgroud)

最后一个逗号问题

json.loads 不接受最后一个逗号:

{
  "property": "text", 
  "property2": "text2",
}
Run Code Online (Sandbox Code Playgroud)

解决方案: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"}
Run Code Online (Sandbox Code Playgroud)

使用ast将阻止您单引号和最终逗号问题.

带单引号的json.dumps

eval()轻松使用单引号,您可以使用以下代码:

import ast
import json

data = json.dumps(ast.literal_eval(json_data_single_quote))
Run Code Online (Sandbox Code Playgroud)

json.dumps 文件

ast Python 3 doc

ast Python 2 doc

我希望它有所帮助.


Yep*_*_Me 78

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}'
Run Code Online (Sandbox Code Playgroud)

所以这行不正确,因为你正试图load蟒蛇dict,并json.loads期待一个有效的json string应该有<type 'str'>.

因此,如果您正在尝试加载json,您应该更改加载的内容,json_string如上所示,或者您应该转储它.这是我对给定信息的最佳猜测.你想要完成的是什么?

此外,您不需要u在字符串之前指定,如注释中提到的@Cld.

  • *json.loads 将加载一个 --&gt;json object&lt;-- 到 python dict* -- 这与文档所说的甚至你自己的代码所做的相反——你在字符串上使用 load(),而不是一个 *json 对象 *。 (2认同)

小智 8

  1. 用双引号替换所有单引号
  2. 将'u''从你的字符串替换为'''...所以基本上在将字符串加载到json之前将内部unicode转换为字符串

    __CODE__

    __CODE__

    __CODE__