Python / Json : 큰 따옴표로 묶인 속성 이름 예상


109

Python에서 JSON 개체를로드하는 좋은 방법을 찾으려고 노력해 왔습니다. 이 json 데이터를 보냅니다.

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

백엔드에 문자열로 수신 한 다음 json.loads(data)구문 분석하는 데 사용 했습니다.

그러나 매번 같은 예외가 발생했습니다.

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

나는 그것을 봤지만 json.loads(json.dumps(data))json 형식이 아닌 데이터조차도 모든 종류의 데이터를 받아들이 기 때문에 개인적으로 효율적이지 않은 이 솔루션 외에는 아무것도 작동하지 않는 것 같습니다 .

어떤 제안이라도 대단히 감사하겠습니다.


18
내 실수는 큰 따옴표가 아닙니다. 파이썬 에서처럼 마지막 키-값 쌍 뒤에 쉼표를 추가했습니다. JSON에서는 그렇게하지 않습니다.
Luv33preet

4
항상 사용 json.dumps()파이썬을 작성하고 파이썬 표기법 자바 스크립트 리더에서 작동 것으로 기대보다는.
vy32

나는 a의 결과를 취하고 print(jsonpickle_deserialized_object_string)그것을 사용하려고 했기 때문에이 문제가있었습니다 . 어떤 이유 print()에서 따옴표를 변경 "하는'
StingyJack

@ Luv33preet, 감사합니다. 하지만 logger-msg가 누락 된 쉼표 등으로 예상되지만이 오류는 그것에 대해 아무 것도 알려주지 않습니다.
ganeshdeshmukh

답변:


150

이:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

JSON이 아닙니다.
이:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

JSON입니다.

편집 :
일부 주석가는 위의 내용이 충분하지 않다고 제안했습니다.
JSON 사양-RFC7159 는 문자열이 따옴표로 시작하고 끝나는 것을 명시합니다. 그것은입니다 ".
단일 정족수 '는 JSON에서 의미 론적 의미가 없으며 문자열 내에서만 허용됩니다.


4
Thanx :) 나는 그것에주의를 기울이지 않았다. 나는 데이터를 보낼 때 올바른 json 형식을 사용하고 있지만 그것이 백엔드에서 수신 될 때 큰 따옴표는 작은 따옴표로 대체된다! 따라서 나는 그 예외가 있습니다.
raeX

25
이것은 해결책이 아닙니다. 해결책은 문자열을 유효한 json으로 수정하는 방법을 알려줍니다.
FistOfFury

2
@FistOfFury 죄송하지만 귀하의 진술은 임의의 유효하지 않은 JSON 문자열이 프로그래밍 방식으로 유효한 문자열로 안정적으로 변환 될 수 있다는 잘못된 가정을 기반으로합니다. 이 질문에 대한 많은 답변은 '를 "등으로 대체하여 문제를 해결하려고합니다. 이러한"솔루션 "을 깨뜨릴 입력 문자열의 간단한 예를 제공해야합니까? 분명히 OP는 우리가 다루는 것이 아니라는 것을 이해했습니다. JSON 및 계속 진행할 수있었습니다-내 대답을 받아 들였습니다. 힌트-입력 문자열은 Python dict .__ repr __ () 메서드의 출력과 더 비슷해 보입니다.
ElmoVanKielmo

4
@ElmoVanKielmo는 귀하의 답변이 질문에 대한 답변이 아니라 진술이라는 사실을 변경하지 않습니다. 문맥이나 설명을 제공하지 않습니다. 질문에 대한 정보를 찾기 위해 여기에 오는 사람들은 실망 할 것입니다. 당신은 OP를 도왔을지 모르지만 다른 사람들은 그렇게 많이하지 않았습니다.
FistOfFury

간단하고 명확한 진술은 종종 많은 도움이됩니다. 특히 주변에 다른 답변이 많이있을 때.
Ben

46

JSON은 큰 따옴표로 문자열을 묶는 것만 허용하므로 다음과 같이 문자열을 조작 할 수 있습니다.

str = str.replace("\'", "\"")

JSON에 이스케이프 된 작은 따옴표 ( \')가있는 경우 더 정확한 다음 코드를 사용해야합니다.

import re
p = re.compile('(?<!\\\\)\'')
str = p.sub('\"', str)

이렇게하면 JSON 문자열에서 모든 작은 따옴표가 큰 따옴표로 바뀌고 str후자의 경우 이스케이프 된 작은 따옴표가 대체되지 않습니다.

js-beautify덜 엄격한 것을 사용할 수도 있습니다 .

$ pip install jsbeautifier
$ js-beautify file.js

4
모든 's를 "s which is wrong"으로 대체 할 수 있으므로 좋지 않습니다. 예 :'it 's bad '-> "it"s bad "-> 잘못된 문자열
Reihan_amn

@Reihan_amn 이스케이프 된 작은 따옴표가 사용되는 경우에 대해보다 정확한 정규식 대안을 추가했습니다.
참가

정규 표현식이 구문 오류를 제공합니다
Wolfgang Fahl

@WolfgangFahl 지금 다시 시도 할 수 있습니다.
elig

thx 지금 대신 stackoverflow.com/a/63862387/1497139를 사용하고 있습니다
Wolfgang Fahl

33

제 경우에는 큰 따옴표가 문제가되지 않았습니다.

마지막 쉼표는 동일한 오류 메시지를주었습니다.

{'a':{'b':c,}}
           ^

이 쉼표를 제거하기 위해 간단한 코드를 작성했습니다.

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

그리고 이것은 나를 위해 일했습니다.


4
+1 확인할 수 있습니다. 후행 쉼표는이 오류 메시지를 생성합니다. 예 : echo '{"json":"obj",}' | python -m json.tool , 셸에서 실행하면 "큰 따옴표로 묶인 예상 속성 이름 : 줄 1 열 15 (문자 14)"가 표시됩니다. 후행 쉼표는 합법적 인 JSON이 아니지만이 경우 Python JSON 모듈이 관련 오류 메시지를 표시하면 좋을 것입니다.
Laryx Decidua

7

간단히 말해서이 문자열은 유효한 JSON이 아닙니다. 오류에서 알 수 있듯이 JSON 문서는 큰 따옴표를 사용해야합니다.

데이터 소스를 수정해야합니다.


6

JSON 데이터를 확인했습니다.

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

에서 http://jsonlint.com/ 과 결과는 :

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'

다음 문자열로 수정하면 JSON 오류가 해결됩니다.

{
    "http://example.org/about": {
        "http://purl.org/dc/terms/title": [{
            "type": "literal",
            "value": "Anna's Homepage"
        }]
    }
}

2
그 링크에 감사드립니다!
WolVes

6

JSON 문자열은 큰 따옴표를 사용해야합니다. JSON Python 라이브러리는이를 적용하므로 문자열을로드 할 수 없습니다. 데이터는 다음과 같아야합니다.

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

그것이 당신이 할 수있는 일이 아니라면 ast.literal_eval()대신 사용할 수 있습니다.json.loads()


3
이는 Python 라이브러리의 제한이 아니라 JSON 형식 자체의 제한입니다.
Daniel Roseman

당신이 올바른지. 그러나 일부 JSON 파서는 큰 따옴표를 적용하지 않습니다. 내 대답을 업데이트하겠습니다.
alexbclay

이하지-JSON은 결코 단일 인용 문자열 내부에 큰 따옴표가없는 제공, 당신이 할 일은 호출하기 전에 문자열 대체를 복식에 대한 모든 싱글입니다json.loads()
nigel222

2
사용 ast.literal_eval하면 ValueError: malformed stringJSON 문자열에 부울 값이있는 경우 가 발생 합니다.
Scratch'N'Purr

4
import ast

inpt = {'http://example.org/about': {'http://purl.org/dc/terms/title':
                                     [{'type': 'literal', 'value': "Anna's Homepage"}]}}

json_data = ast.literal_eval(json.dumps(inpt))

print(json_data)

이것은 문제를 해결할 것입니다.


3

오류로 명확하게 말하듯이 이름은 작은 따옴표 대신 큰 따옴표로 묶어야합니다. 전달하는 문자열은 유효한 JSON이 아닙니다. 다음과 같아야합니다.

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

2

이 방법을 사용하여 원하는 출력을 얻었습니다. 내 스크립트

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"

x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

산출

>>> 0

2
with open('input.json','r') as f:
    s = f.read()
    s = s.replace('\'','\"')
    data = json.loads(s)

이것은 나를 위해 완벽하게 잘 작동했습니다. 감사.


2
x = x.replace("'", '"')
j = json.loads(x)

이것이 올바른 솔루션이지만 이와 같은 JSON이 있으면 꽤 골치 아픈 일이 될 수 있습니다.

{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}

"True" 값을 보셨습니까 ? 이것을 사용하여 Booleans를 두 번 확인합니다. 이 경우에 적용됩니다.

x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"')
j = json.loads(x)

또한, 당신이 만들지 않도록 확인하십시오

x = json.loads(x)

다른 변수 여야합니다.


1

나는 비슷한 문제가 있었다. 서로 통신하는 두 구성 요소는 대기열을 사용하고있었습니다.

첫 번째 구성 요소는 메시지를 대기열에 넣기 전에 json.dumps를 수행하지 않았습니다. 따라서 수신 구성 요소에서 생성 된 JSON 문자열은 작은 따옴표로 묶였습니다. 이로 인해 오류가 발생했습니다.

 Expecting property name enclosed in double quotes

json.dumps를 추가하면 올바른 형식의 JSON이 생성되고 문제가 해결되었습니다.


0

eval기능을 사용하십시오 .

작은 따옴표와 큰 따옴표 사이의 불일치를 처리합니다.


사용자 입력이나 HTTP 요청과 함께 오는 데이터에 절대로 eval을 사용하지 마십시오. 이것은 엄청난 보안 문제입니다.
ElmoVanKielmo

0

다른 답변에서 잘 설명했듯이 json 모듈에 잘못된 따옴표 문자가 전달되어 오류가 발생합니다.

내 경우에는 내가 심지어 교체 한 후 ValueError를 얻을 지속적 '으로 "내 문자열. 내가 마침내 깨달은 것은 따옴표와 같은 유니 코드 기호가 내 문자열에 들어갔다는 것입니다.

           `  ´     

이 모든 것을 정리하려면 정규 표현식을 통해 문자열을 전달할 수 있습니다.

import re

raw_string = '{“key”:“value”}'

parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)

json_object = json.loads(parsed_string)

-1

JSON을 손으로 편집했을 때이 문제가 여러 번 발생했습니다. 누군가가 모르게 파일에서 무언가를 삭제하면 동일한 오류가 발생할 수 있습니다.

예를 들어 JSON 마지막 "}"이 누락 된 경우 동일한 오류가 발생합니다.

따라서 파일을 직접 편집하는 경우 JSON 디코더에서 예상 한대로 포맷해야합니다. 그렇지 않으면 동일한 문제가 발생합니다.

도움이 되었기를 바랍니다!


-2

json.dumps()방법 을 사용하는 것이 항상 이상적입니다 . 이 오류를 없애기 위해 다음 코드를 사용했습니다.

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