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

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 형식이 아닌 데이터조차도 모든 종류의 데이터를 받아들이 기 때문에 개인적으로 효율적이지 않은 이 솔루션 외에는 아무것도 작동하지 않는 것 같습니다 .

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



답변

이:

{'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에서 의미 론적 의미가 없으며 문자열 내에서만 허용됩니다.


답변

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


답변

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

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

{'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)

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


답변

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

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


답변

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"
        }]
    }
}


답변

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

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

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


답변

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)

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