[python] JSON ValueError : 예상 속성 이름 : 줄 1 열 2 (문자 1)

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.loadsjson 속성에는 큰 따옴표 만 허용합니다 .

{
    "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 선적 서류 비치

ast Python 3 문서

ast Python 2 문서

수단

JSON을 자주 편집하는 경우 CodeBeautify를 사용할 수 있습니다 . 구문 오류를 수정하고 JSON을 축소 / 미화하는 데 도움이됩니다.

도움이되기를 바랍니다.


답변

  1. 모든 작은 따옴표를 큰 따옴표로 바꿉니다.
  2. 문자열의 ‘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}; 큰 따옴표가 효과적으로 제거되었습니다.


답변