JSON值错误:需要属性名称:第1行第2列(字符1)

hfsqlsce  于 2022-12-24  发布在  其他
关注(0)|答案(6)|浏览(180)

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

但我不知道该怎么办才好。2如有任何建议,我将不胜感激。

brccelvz

brccelvz1#

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

单引号问题

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

{
    'property': 1
}

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

{
    "property": 1
}

最终逗号问题

json.loads不接受结尾逗号:

{
  "property": "text", 
  "property2": "text2",
}

溶液:ast解决单引号和结尾逗号问题

你可以使用ast(Python 2和Python 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. dump

要轻松使用带单引号的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。

wmtdaxz3

wmtdaxz32#

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。

t98cgbkg

t98cgbkg3#

1.将所有单引号替换为双引号
1.将字符串中的'u”'替换为'"' ...所以在将字符串加载到JSON之前,基本上将内部unicode转换为字符串

>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))
4c8rllxm

4c8rllxm4#

所有其他答案可能回答您的查询,但我遇到了同样的问题,这是由于杂散的,,我添加在我的json字符串的末尾,如下所示:

{
 "key":"123sdf",
 "bus_number":"asd234sdf",
}

当我像这样删除额外的,时,我终于让它工作起来了:

{
 "key":"123sdf",
 "bus_number":"asd234sdf"
}

希望这个能帮上忙!干杯。

qpgpyjmq

qpgpyjmq5#

使用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'}]
hkmswyz6

hkmswyz66#

我遇到的另一个例子是,我使用echo将JSON通过管道传输到我的python脚本中,不小心将JSON字符串用双引号括起来:

echo "{"thumbnailWidth": 640}" | myscript.py

注意JSON字符串本身有引号,我应该这样做:

echo '{"thumbnailWidth": 640}' | myscript.py

事实上,这就是python脚本收到的内容:{thumbnailWidth: 640};双引号被有效地去除。

相关问题