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)
이것은 문제를 해결할 것입니다.