JSON 형식
JSON (JavaScript Object Notation) 파일은 인터넷에서 서버와 클라이언트 사이 통신에 많이 사용하는 텍스트 표기 형식입니다. REST API에서도 많이 사용하고, 설정 파일로 사용하기도 하죠. 다음과 같이 사람과 컴퓨터가 읽을 수 있는 텍스트 형식입니다.
{
"key": "value",
"list": [
{"str": "text string"},
{
"number": {"int": 1234, "float": 12.34}
},
{"True": true},
{"False": false},
{"None": null}
]
}
JSON에는 { }로 표기하는 객체(object), [ ]로 표기하는 배열(array), 큰 따옴표로 감싸는 문자열(string), 숫자(number), 불리언(boolean), null 자료형이 있습니다. 객체는 키와 값으로 이루어지는데, 키는 문자열이고, 값은 위의 6가지 자료형 중 하나가 될 수 있습니다. 객체 안에 객체를 넣는 것도 가능합니다. 배열에도 여러 자료형들이 함께 들어갈 수 있습니다.
파이썬에서 JSON 읽기
파이썬에서 JSON 파일을 읽으려면 다음과 같이 json 모듈의 load 함수를 사용하면 됩니다.
import json
with open('data.json') as fj:
data = json.load(fj)
문자열(str 또는 bytes, bytearray)에 json 내용이 들어있을 경우 loads를 이용합니다.
import json
js = '{"key": "value"}'
data = json.loads(js)
이렇게 읽어들인 data는 파이썬에서 dict 자료형이 됩니다. JSON 자료형은 읽었을 때 아래와 같이 파이썬 자료형으로 변환됩니다.
| JSON | Python |
| object | dict |
| array | list |
| string | str |
| number (integer) | int |
| number (real) | float |
| true | True |
| false | False |
| null | None |
파이썬에서 JSON 쓰기
파이썬에서 JSON 파일을 쓰려면 dump, 문자열에 쓰려면 dumps 함수를 이용합니다.
import json
data = ["list", {'key': 'value'}]
with open('data.json', 'w') as fj:
json.dump(data, fj)
js = json.dumps(data, indent=4)
dumps에서 indent 옵션을 넣으면 출력시 보기 좋게 만들어줍니다. 파이썬 자료형은 아래와 같이 JSON 자료형으로 변환됩니다.
| Python | JSON |
| dict | object |
| list, tuple | array |
| str | string |
| int, float, (int, float 열거형) | number |
| True | true |
| False | false |
| None | null |
JSON 파일에 한글 쓰기
파이썬 문자열에 한글이 포함되어 있을 경우 위의 dump, dumps를 이용해 JSON 파일이나 문자열을 쓰면 한글이 바로 표시되지 않습니다. 그래도 load, loads로 읽으면 제대로 읽어지기는 합니다. 파일이나 문자열로 썼을 때 한글이 바로 표시되게 만들고 싶으면 dump, dumps에 ensure_ascii=False 옵션을 주면 됩니다.
import json
data = ["list", {'key': '한글'}]
with open('data.json', 'w') as fj:
json.dump(data, fj, ensure_ascii=False)
js = json.dumps(data, indent=4, ensure_ascii=False)
제어 문자가 들어간 문자열
\n, \t, \r, \0과 같은 제어 문자가 들어간 문자열을 json.loads로 읽어들이려고 하면 JSONDecodeError가 발생합니다. 제어 문자를 포함하고 싶으면 strict=False 옵션을 주면 됩니다.
js = """
["list",
{"key": "
한글
"}]
"""
data = json.loads(js, strict=False)