JSON의 단일 따옴표와 이중 따옴표
내 코드:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
가
#2
가
Python에서는 그 단일 따옴표와 이중 따옴표는 서로 바꿀 수 있다고 들었습니다.누가 이걸 설명해 줄 수 있나요?
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)
예를 들어 이러한 비표준 JSON을 스트리밍하는 경우 지금까지의 답변에 관한 두 가지 문제가 있습니다.그러면 (파이썬 사전이 아닌) 들어오는 문자열을 해석해야 할 수 있기 때문입니다.
1 - '1' -demjson
: 3.를 사용하면 Python > 3.하지 않기 수 Python 3.7.+ conda > Python > 3.5 > demjson j을 。 저는 예를 더 합니다.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: 」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(사전)은 올바르게 해석되지만 필요한 것은 변환되지 않습니다.
demjson은 잘못된 json 구문의 문제를 해결하는데도 좋은 패키지입니다.
pip install demjson
사용방법:
from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)
편집:
demjson.decode
json을 입니다만, 데이터의 큰 「json」을 는, json의 데이터 「json」을 참조해 주세요.ast.literal_eval
더 잘 어울리고 훨씬 더 빠릅니다.
다음과 같이 수정할 수 있습니다.
s = "{'username':'dfdsfdsf'}"
j = eval(s)
앞서 말한 바와 같이 JSON은 Python 구문이 아닙니다.JSON에서는 큰따옴표를 사용해야 합니다.그 제작자는 프로그래머의 인지 과부하를 완화하기 위해 허용 가능한 구문의 엄격한 하위 집합을 사용하는 것으로 유명하다.
아래는 JSON 문자열 중 하나에 @Jiaaro가 지적한 단일 따옴표가 포함되어 있으면 실패할 수 있습니다.사용하지 마십시오. 작동하지 않는 것의 예로서 여기에 남겨져 있습니다.
JSON 문자열에 단일 따옴표가 없다는 것을 알면 매우 유용합니다.예를 들어, 브라우저 콘솔이나 다른 곳에서 복사하여 붙여넣었습니다.그럼 그냥 입력하시면 됩니다.
a = json.loads('very_long_json_string_pasted_here')
그렇지 않으면 작은 따옴표를 사용했을 경우에도 깨질 수 있습니다.
저는 최근에 매우 유사한 문제에 부딪혔고, 제 솔루션이 당신에게도 효과가 있을 것이라고 믿습니다.텍스트 파일에는 다음과 같은 형식의 항목 목록이 포함되어 있습니다.
["first item", 'the "Second" item', "thi'rd", 'some \\"hellish\\" \'quoted" item']
위의 내용을 python 목록으로 해석하고 싶었지만 입력을 신뢰할 수 없었기 때문에 eval()에 관심이 없었습니다.처음에 JSON을 사용해 보았지만, 이중 따옴표로 묶인 항목만 사용할 수 있기 때문에 이 특정 케이스에 대해 매우 심플한 렉서를 작성했습니다('문자열 분석'을 삽입하기만 하면 출력 목록으로 표시됩니다).
#This lexer takes a JSON-like 'array' string and converts single-quoted array items into escaped double-quoted items,
#then puts the 'array' into a python list
#Issues such as ["item 1", '","item 2 including those double quotes":"', "item 3"] are resolved with this lexer
items = [] #List of lexed items
item = "" #Current item container
dq = True #Double-quotes active (False->single quotes active)
bs = 0 #backslash counter
in_item = False #True if currently lexing an item within the quotes (False if outside the quotes; ie comma and whitespace)
for c in stringtoparse[1:-1]: #Assuming encasement by brackets
if c=="\\": #if there are backslashes, count them! Odd numbers escape the quotes...
bs = bs + 1
continue
if (dq and c=='"') or (not dq and c=="'"): #quote matched at start/end of an item
if bs & 1==1: #if escaped quote, ignore as it must be part of the item
continue
else: #not escaped quote - toggle in_item
in_item = not in_item
if item!="": #if item not empty, we must be at the end
items += [item] #so add it to the list of items
item = "" #and reset for the next item
continue
if not in_item: #toggle of single/double quotes to enclose items
if dq and c=="'":
dq = False
in_item = True
elif not dq and c=='"':
dq = True
in_item = True
continue
if in_item: #character is part of an item, append it to the item
if not dq and c=='"': #if we are using single quotes
item += bs * "\\" + "\"" #escape double quotes for JSON
else:
item += bs * "\\" + c
bs = 0
continue
그것이 누군가에게 유용하기를 바란다.맛있게 드세요!
eval 기능을 사용하여 문제를 해결했습니다.
single_quoted_dict_in_string = "{'key':'value', 'key2': 'value2'}"
desired_double_quoted_dict = eval(single_quoted_dict_in_string)
# Go ahead, now you can convert it into json easily
print(desired_double_quoted_dict)
사용할 수 있습니다.
json.dumps(your_json, separators=(",", ":"))
import ast
answer = subprocess.check_output(PYTHON_ + command, shell=True).strip()
print(ast.literal_eval(answer.decode(UTF_)))
효과가 있다
import json
#1
single_quote_dictioary = "{'username':'dfdsfdsf'}"
json.loads(single_quote_dictioary)
the out put error: json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
that error is not from python side, it is how JSON format works!
언급URL : https://stackoverflow.com/questions/4162642/single-vs-double-quotes-in-json
'programing' 카테고리의 다른 글
반응 16.7 - 반응.SFC는 폐지되었습니다. (0) | 2023.04.03 |
---|---|
JSON.stringify가 Json 오브젝트에 \와 "를 추가하는 문제 (0) | 2023.04.03 |
polylang을 통해 페이지 언어 가져오기 및 동일한 언어 페이지로 리디렉션 (0) | 2023.04.03 |
HttpClient에 개체를 전달하려면 어떻게 해야 합니까?PostAsync와 JSON 바디로 시리얼화하시겠습니까? (0) | 2023.04.03 |
GSON을 사용하여 JSON 파일을 해석하는 방법 (0) | 2023.04.03 |