JSON值错误:应为属性名:第1行第2列(字符1)

2024-04-25 04:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用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})

但我不知道该怎么做才能修好它。任何建议都将不胜感激。


Tags: kafkafromtestimportjsondbconsumercollection
3条回答
  1. 用双引号替换所有单引号
  2. 将字符串中的“u”替换为“。。。因此,在将字符串加载到json之前,基本上将内部unicode转换为字符串
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))

json.loads将json字符串加载到python中,dictjson.dumps将pythondict转储到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格式,或者应该转储它。这只是我从给定信息中最好的猜测。你想完成什么?

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

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

单报价问题

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

{
    'property': 1
}

但是,{}只接受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警告我们不要使用大型/复杂字符串:

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。

我希望有帮助。

相关问题 更多 >