프로그래밍/Python

[Python] JSON 문자열 다루기

채윤아빠 2023. 5. 16. 08:22
728x90
반응형

개요

JSON 문자열을 dict로 변환하거나, 반대로 dict를 JSON 문자열로 변한하여 처리하는 방법을 알아보겠습니다.


dict를 JSON 문자열로 변환하기

간단하게 json.dumps() 함수를 이용하면 됩니다.

from json import dumps

json_str = dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
print(json_str)

""" Result>>>
["foo", {"bar": ["baz", null, 1.0, 2]}]
"""

주의할 점은 한글과 같이 UTF 문자열 데이터가 포함되어 있는 dict를 dumps() 함수로 문자열로 변환을 시도하면 다음과 같이 인코딩되어 변환되기 때문에 바로 읽을 수가 없게 됩니다.

from json import dumps

json_str = dumps(['foo', {'데이터': ('값', None, 1.0, 2)}])
print(json_str)

""" Result>>>
["foo", {"\ub370\uc774\ud130": ["\uac12", null, 1.0, 2]}]
"""

유니코드 문자열 그대로 변환하게 하기 위하여, "ensure_ascii = False" 매개변수를 추가하여 호출합니다.

from json import dumps

json_str = dumps(['foo', {'데이터': ('값', None, 1.0, 2)}], ensure_ascii = False)
print(json_str)

""" Result>>>
["foo", {"데이터": ["값", null, 1.0, 2]}]
"""

dumps() 함수를 호출할 때 "indent" 매개변수 없이 호출을 하게 되면 JSON 문자열이 한 줄로 변환되어 눈으로 보면서 확인하기가 어렵습니다. 파일로 저장하여 사용자가 설정할 수 있도록 할 경우라면, "indent" 매개변수에 들여쓰기 값을 할당하여 예쁘게? 변환할 수 있습니다.

from json import dumps

json_str = dumps(['foo', {'데이터': ('값', None, 1.0, 2)}], ensure_ascii = False, indent = 4)
print(json_str)

""" Result>>>
[
    "foo",
    {
        "데이터": [
            "값",
            null,
            1.0,
            2
        ]
    }
]
"""

JSON 문자열을 dict로 변환하기

앞서 json.dumps() 함수와 반대로 JSON 문자열을 dict로 변환때에는 json.loads() 함수를 이용합니다.

from json import loads

json_str = '["foo", {"bar": ["baz", null, 1.0, 2]}]'
data = loads(json_str)
print(data)
""" Result >>>
['foo', {'bar': ['baz', None, 1.0, 2]}]
"""

마지막으로 텍스트 파일로부터 읽어서 dict로 변환하는 예시입니다.

from json import loads
from os import path

if (not path.exists(json_file_path)):
    return (None, "load json error: FileNotFoundError: [Errno 2] No such file")

with open(json_file_path, mode = "r", encoding = 'UTF-8') as f:
    json_str = f.read()
    try:
        json_data = loads(json_str)
        return (json_data, '')
    except Exception as e:
        return (None, f'load json error: {e}')

참고자료