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


97

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})

그러나 나는 그것을 고치기 위해 무엇을 해야할지 모른다. 조언을 주시면 감사하겠습니다.


3
거기에 구문 오류가 있습니까? 이탈 "은 복사 붙여 넣기 오류입니까?
karthikr

줄에 출력 된 JSON 문자열은 무엇입니까 print tweet.message.value?
Luke Woodward

1
ValueError때문에 JSON 입력하지 코드에서 문제의 오류 전송된다. ( "보통 파일을 보내야하는 누락 된 사람 SyntaxError
외에는

(그런데 utf_8은 json.loads의 기본 인코딩이므로 표시 할 필요가 없습니다.)
Cld

입력 해 주셔서 감사합니다. 질문을 수정했습니다. 이제 더 명확 해집니다.
dredbound 2014 년

답변:


83

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가 언급했듯이 문자열 앞에 를 지정할 필요가 없습니다 .


2
파이썬 딕셔너리로 -> JSON 객체 <- json.loads는로드됩니다 - 즉, 문서의 말에 반대하며 자신의 코드는 않아도 무엇을 - 당신이 아닌 문자열에 () 부하를 사용하는 JSON 개체 .
7stud

예 @ 7stud, 맞습니다. 문자열을로드하고 있습니다. 그러나 유효한 json 문자열이어야합니다. 내 답변을 업데이트했습니다.
Yep_It's_Me

186

동일한 오류를 반환하는 다른 문제가 발생했습니다.

작은 따옴표 문제

작은 따옴표가 있는 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을 축소 / 미화하는 데 도움이됩니다.

도움이되기를 바랍니다.


10
  1. 모든 작은 따옴표를 큰 따옴표로 바꿉니다.
  2. 문자열의 'u "'를 '"'로 바꾸십시오. 따라서 기본적으로 문자열을 json으로로드하기 전에 내부 유니 코드를 문자열로 변환하십시오.
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))

1
더 파이썬적인 방법은 ast.literal_eval ( "{u'key ': u'val'}")을 사용하는 것입니다. 그것은 모든 형식 관련 문제 처리됩니다
인 Vinay 판데

json.loads (strs.replace ( 'u "', ''))가 작동하지 않습니다. 아래 오류는 다음과 같습니다. Traceback (가장 최근 호출 마지막) : File"<stdin> ", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", 줄 338,로드시 _default_decoder.decode (s) obj, end = self.scan_once (s , IDX)에 ValueError : 기대 속성 명 : 1 행 2 열 (1 문자)
산제 프라 딥

4

다른 모든 답변은 귀하의 질문에 답할 수 있지만 ,다음과 같이 json 문자열 끝에 추가 한 길 잃음으로 인한 동일한 문제에 직면 했습니다.

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

나는 ,다음과 같이 여분을 제거했을 때 마침내 작동하게되었습니다 .

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

이 도움을 바랍니다! 건배.


1
이 이미 적용되어 있지만 좋은 일이, jedema의 대답
fedorqui 'SO 해치지 중지'

그 부분은 내 대답 (후에 추가 된 @fedorqui stackoverflow.com/posts/36599122/revisions 자), 당신 수도 싶어주고 +1 :
Rishabh 인스 Agrahari

1
오, 당신 말이 맞아요! 2018 년 1 월에 추가되었습니다. 사과하고 +1 :)
fedorqui 'SO stop harming'1

0

사용 된 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'}]

0

이 문제가 발생한 다른 경우 echo는 JSON을 Python 스크립트로 파이프하는 데 사용 하고 JSON 문자열을 큰 따옴표로 부주의하게 감싼 경우입니다.

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

JSON 문자열 자체에는 따옴표가 있으며 수행해야합니다.

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

그대로, 이것은 파이썬 스크립트가받은 것입니다 : {thumbnailWidth: 640}; 큰 따옴표가 효과적으로 제거되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.