python - JSON 值错误 : Expecting property name: line

我在使用 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 将通过像 Python 字典一样插入 JSON 来防止单引号和逗号问题(因此您必须遵循 Python 字典语法)。对于文字结构,它是 eval() 函数的一个很好且安全的替代方案。

Python documentation警告我们使用大/复杂的字符串:

Warning It is possible to crash the Python interpreter with a sufficiently large/complex string due to stack depth limitations in Python’s AST compiler.

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 doc

工具

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

希望对你有帮助。

关于python - JSON 值错误 : Expecting property name: line 1 column 2 (char 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25707558/

相关文章:

python - python中的json.dump()和json.dumps()有什么区别?

arrays - 数组可以是顶级 JSON 文本吗?

jquery - Rails 无法正确解码来自 jQuery 的 JSON(数组变成带有整数键的散列

javascript - 在 promise 链上使用 setTimeout

javascript - JSON 是否应该包含空值

c# - 将 POST 中的 json 发送到 Web API 服务时出错

python - Google App Engine 模型的 JSON 序列化

javascript - 如果名称包含点,如何获取对象值?

c# - Protocol Buffer 与 JSON 或 BSON

python - 如何使用 python 请求和处理 JSON?