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.loads
파이썬으로 JSON 문자열을로드 dict
, json.dumps
파이썬을 덤프 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
파이썬을 시도하고 있기 때문에 올바르지 dict
않으며, 있어야 json.loads
할 유효한 json string
것을 기대하고 있습니다 <type 'str'>
.
따라서 json을로드하려는 경우로드중인 내용을 json_string
위와 같이 변경 하거나 덤프해야합니다. 이것은 주어진 정보에서 내 최선의 추측입니다. 달성하려는 것이 무엇입니까?
또한 u
주석에서 @Cld가 언급했듯이 문자열 앞에 를 지정할 필요가 없습니다 .
답변
동일한 오류를 반환하는 다른 문제가 발생했습니다.
작은 따옴표 문제
작은 따옴표가 있는 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 문서 는 크고 복잡한 문자열 사용에 대해 경고했습니다.
경고 Python의 AST 컴파일러의 스택 깊이 제한으로 인해 충분히 크거나 복잡한 문자열로 Python 인터프리터가 충돌 할 수 있습니다.
작은 따옴표가있는 json.dumps
사용하려면 json.dumps
작은 따옴표로 쉽게이 코드를 사용할 수 있습니다 :
import ast
import json
data = json.dumps(ast.literal_eval(json_data_single_quote))
ast
선적 서류 비치
수단
JSON을 자주 편집하는 경우 CodeBeautify를 사용할 수 있습니다 . 구문 오류를 수정하고 JSON을 축소 / 미화하는 데 도움이됩니다.
도움이되기를 바랍니다.
답변
- 모든 작은 따옴표를 큰 따옴표로 바꿉니다.
- 문자열의 ‘u “‘를 ‘”‘로 바꾸십시오. 따라서 기본적으로 문자열을 json으로로드하기 전에 내부 유니 코드를 문자열로 변환하십시오.
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))
답변
다른 모든 답변은 귀하의 질문에 답할 수 있지만 ,
다음과 같이 json 문자열 끝에 추가 한 길 잃음으로 인한 동일한 문제에 직면 했습니다.
{
"key":"123sdf",
"bus_number":"asd234sdf",
}
나는 ,
다음과 같이 여분을 제거했을 때 마침내 작동하게되었습니다 .
{
"key":"123sdf",
"bus_number":"asd234sdf"
}
이 도움을 바랍니다! 건배.
답변
사용 된 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'}]
답변
이 문제가 발생한 다른 경우 echo
는 JSON을 Python 스크립트로 파이프하는 데 사용 하고 JSON 문자열을 큰 따옴표로 부주의하게 감싼 경우입니다.
echo "{"thumbnailWidth": 640}" | myscript.py
JSON 문자열 자체에는 따옴표가 있으며 수행해야합니다.
echo '{"thumbnailWidth": 640}' | myscript.py
그대로, 이것은 파이썬 스크립트가받은 것입니다 : {thumbnailWidth: 640}
; 큰 따옴표가 효과적으로 제거되었습니다.