2020-01-15
json 형식으로 된 문자열을 dictionary로 변경 하거나 다시 문자열로 만들때, json모듈을 사용하면 된다.
문자열 -> dictionary: json.loads()
dictionary -> 문자열: json.dumps()
>>> import json
>>>
>>> string = '{"1":"one", "2":"둘", "삼":"셋"}'
>>> # 문자열 -> dictionary
>>> s2d = json.loads(string)
>>> print(s2d)
{'1': 'one', '2': '둘', '삼': '셋'}
>>>
>>> # dictionary -> 문자열
>>> d2s = json.dumps(s2d)
>>> print(d2s)
{"1": "one", "2": "\ub458", "\uc0bc": "\uc14b"}
>>>
>>> # 한글 변환 문제
>>> d2s_ko = json.dumps(s2d, ensure_ascii=False)
>>> print(d2s_ko)
{"1": "one", "2": "둘", "삼": "셋"}
>>>
>>> # 문자열에 홑따옴표(') 문제: 에러 발생
>>> string_small = "{'1:'one', '2':'two'}"
>>> s2d_small = json.loads(string_small)
Traceback (most recent call last):
  File "<pyshell#110>", line 1, in <module>
    s2d_small = json.loads(string_small)
  File "C:\ProgramData\Anaconda3\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "C:\ProgramData\Anaconda3\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\ProgramData\Anaconda3\lib\json\decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
>>>
>>> # 홑따옴표(')를 겹따옴표(")로 변환
>>> s2d_small = json.loads(string.replace("'", "\""))
>>> print(s2d_small)
{'1': 'one', '2': '둘', '삼': '셋'}
>>>
>>> # list 변환
>>> string_list = '[1,2,3,"4"]'
>>> s2d_list = json.loads(string_list)
>>> print(s2d_list)
[1, 2, 3, '4']
>>>
>>> d2s_list = json.dumps(s2d_list)
>>> print(d2s_list)
[1, 2, 3, "4"]
list도 변형 가능하며, json특성상 겹따옴표(")로 되어 있어야 한다는걸 유의해야 한다.
한글 변형시에는 dumps에 ensure_ascii=False옵션을 끄면 된다.