JSON ValueError异常:期待属性名:第1行第2列(CHAR 1)JSON ValueEr

2019-05-13 04:17发布

我在使用json.loads转换为一个字典对象麻烦,我想不出我在做什么wrong.The确切的错误我得到运行,这是

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)

我敢肯定的是,误差在2楼至最后一行存在的

jsonTweet=json.loads({u'favorited': False, u'contributors': None})

但我不知道该做些什么来解决它。 任何意见,将不胜感激。

Answer 1:

json.loads将加载JSON字符串转换为Python dictjson.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在评论中提到。



Answer 2:

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

单引号问题

我用了一个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会阻止你的单引号和逗号最终通过问题的解读前面JSON像Python dictionnary(所以你必须遵循的Python语法dictionnary)。 这是一个相当不错的,安全的替代的eval()字面结构的功能。

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

警告:这是可能的,由于栈Python的AST编译器深度限制足够大/复杂的字符串崩溃Python解释器。

用单引号json.dumps

要使用json.dumps用单引号容易,你可以使用此代码:

import ast
import json

data = json.dumps(ast.literal_eval(json_data_single_quote))

ast文件

AST的Python 3文档

AST的Python 2 DOC

工具

如果你经常编辑JSON,你可以使用CodeBeautify 。 它可以帮助你来解决语法错误和缩小/美化JSON。

我希望它能帮助。



Answer 3:

  1. 替换所有单引号用双引号
  2. “U“”从你的字符串“””取代......因此字符串装入JSON之前基本上将内部统一码为字符串
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))


Answer 4:

所有其他的答案可以回答您的查询,但我面对这是由于流浪同样的问题,我在我的JSON字符串像这样的结尾说:

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

我终于当我删除多余它的工作,就像这样:

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

希望这有助于! 干杯。



Answer 5:

用过的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'}]


文章来源: JSON ValueError: Expecting property name: line 1 column 2 (char 1)