[python] JSON의 작은 따옴표와 큰 따옴표

내 코드 :

import simplejson as json

s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)

#1 정의가 잘못되었습니다

#2 정의가 맞다

파이썬에서는 작은 따옴표 와 따옴표를 바꿀 수 있다고 들었습니다 . 누구든지 나에게 이것을 설명 할 수 있습니까?



답변

JSON 구문 은 Python 구문 이 아닙니다. JSON에는 문자열에 큰 따옴표가 필요합니다.


답변

당신이 사용할 수있는 ast.literal_eval()

>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}


답변

다음과 같이 큰 따옴표로 JSON을 덤프 할 수 있습니다.

import json

# mixing single and double quotes
data = {'jsonKey': 'jsonValue',"title": "hello world"}

# get string with all double quotes
json_string = json.dumps(data) 


답변

demjson 은 또한 잘못된 json 구문 문제를 해결하는 데 좋은 패키지입니다.

pip install demjson

용법:

from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)

편집하다:

demjson.decode손상된 json에 대한 훌륭한 도구이지만 json 데이터의 큰 양을 처리 할 때 ast.literal_eval더 나은 일치이며 훨씬 빠릅니다.


답변

예를 들어 하나가 그러한 비표준 JSON을 스트리밍하는 경우 지금까지 답변에 대한 두 가지 문제가 있습니다. 그러면 들어오는 문자열 (파이썬 사전이 아님)을 해석해야 할 수 있기 때문입니다.

문제 1- demjson: Python 3.7. + 및 conda를 사용하면 현재 Python 3.5 이상을 지원하지 않기 때문에 demjson을 설치할 수 없었습니다. 따라서 예를 들어 ast및 / 또는 json.dumps.

문제 2- ast& json.dumps: JSON이 모두 작은 따옴표이고 하나 이상의 값에 문자열이 포함되어 있고 작은 따옴표가 포함 된 경우, 내가 찾은 유일한 간단하면서도 실용적인 솔루션은 둘 다 적용하는 것입니다.

다음 예에서는 line들어오는 JSON 문자열 객체 라고 가정 합니다.

>>> line = str({'abc':'008565','name':'xyz','description':'can control TV\'s and more'})

1 단계 : ast.literal_eval()
2 단계를 사용하여 들어오는 문자열을 사전으로 json.dumps변환 합니다 . 값의 내용을 건드리지 않고 키와 값의 안정적인 변환을 위해 적용 합니다 .

>>> import ast
>>> import json
>>> print(json.dumps(ast.literal_eval(line)))
{"abc": "008565", "name": "xyz", "description": "can control TV's and more"}

json.dumps혼자서는 JSON을 해석하지 않고 문자열 만보기 때문에 작업을 수행하지 않습니다. 유사 ast.literal_eval(): JSON (사전)을 올바르게 해석하지만 필요한 것을 변환하지 않습니다.


답변

다음과 같이 수정할 수 있습니다.

s = "{'username':'dfdsfdsf'}"
j = eval(s)


답변

말했듯이 JSON은 Python 구문이 아닙니다. JSON에서 큰 따옴표를 사용해야합니다. 제작자는 프로그래머의인지 과부하를 완화하기 위해 허용 가능한 구문의 엄격한 하위 집합을 사용하는 것으로 유명합니다.


@Jiaaro가 지적한 것처럼 JSON 문자열 자체에 작은 따옴표가 포함되어 있으면 아래가 실패 할 수 있습니다. 사용하지 마세요. 작동하지 않는 예를 여기에 남겨 두었습니다.

JSON 문자열에 작은 따옴표가 없다는 것을 아는 것은 정말 유용 합니다. 예를 들어 브라우저 콘솔에서 복사하여 붙여 넣었습니다. 그런 다음 입력 할 수 있습니다.

a = json.loads('very_long_json_string_pasted_here')

작은 따옴표도 사용하면 깨질 수 있습니다.