JSON(JavaScript Object Notation)은 가볍고 폭넓게 채택된 데이터 교환 형식입니다. Python에서 JSON 형식화 기법을 활용하면 JSON 문자열을 Python 객체로 변환하거나, 그 반대로 Python 객체를 JSON 문자열로 변환할 수 있습니다.
이러한 기능을 사용하려면 Python의 json 모듈이 필요합니다. 이 모듈은 Python 표준 라이브러리에 포함되어 있으므로 별도 설치 없이 바로 가져와 사용할 수 있습니다.
import jsonPython 객체를 JSON 문자열로 변환하기
json 모듈에는 Python 객체를 JSON으로 변환하는 dump()와 dumps() 메서드가 있습니다.
- dump(): 두 개의 인자를 받습니다. 첫 번째는 변환할 객체, 두 번째는 파일 객체입니다. 객체를 JSON 형식의 스트림으로 직렬화하여 파일 객체에 기록합니다.
- dumps(): 하나의 인자(객체)만 받으며, 객체를 JSON 문자열로 변환해 반환합니다.
예제 코드
import json
from io import StringIO
str_io_obj = StringIO()
# StringIO에 JSON 덤프
json.dump(["India", "Australia", "Brazil"], str_io_obj)
print('StringIO 객체 값: ' + str(str_io_obj.getvalue()))
my_json = {
"name": "Kalyan",
"age": 25,
"city": "Delhi"
}
print(json.dumps(my_json, indent=4))출력 결과
StringIO 객체 값: ["India", "Australia", "Brazil"]
{
"name": "Kalyan",
"age": 25,
"city": "Delhi"
}JSON 문자열을 Python 객체로 변환하기
이 과정은 역직렬화(deserialization)라고 부르며, 두 가지 메서드가 사용됩니다.
- load(): 파일 객체의 데이터를 읽어 Python 객체로 변환합니다.
- loads(): 문자열 타입의 데이터를 Python 객체로 변환합니다.
예제 코드
import json
from io import StringIO
str_io_obj = StringIO('["xyz", "abc", "xyz", "pqr"]')
# StringIO에서 로드
print('Load: ' + str(json.load(str_io_obj)))
print('문자열을 JSON으로: ' + str(json.loads('{"xyz": 1, "abc": 2, "xyz": 3, "pqr": 4}')))출력 결과
Load: ['xyz', 'abc', 'xyz', 'pqr']
문자열을 JSON으로: {'xyz': 3, 'abc': 2, 'pqr': 4}참고로 위 결과에서 'xyz' 키가 중복되어 마지막 값인 3만 남았습니다. JSON 객체에서 동일한 키가 여러 번 나타나면 나중 값이 이전 값을 덮어쓰게 됩니다.
Python의 JSON 인코더와 디코더 클래스
JSONEncoder 클래스는 Python 객체를 JSON 형식으로 변환하는 데 사용됩니다. 아래 예제에서는 복소수(complex) 객체를 JSONEncoder로 변환하는 방법을 살펴봅니다.
예제 코드
import json
class Comp_Encoder(json.JSONEncoder):
def default(self, comp_obj):
if isinstance(comp_obj, complex):
return [comp_obj.real, comp_obj.imag]
return json.JSONEncoder.default(self, comp_obj)
print(json.dumps(5 + 8j, cls=Comp_Encoder))출력 결과
[5.0, 8.0]JSONDecoder 클래스는 그 반대 동작, 즉 JSON 문자열을 Python 객체로 디코딩하는 역할을 합니다. decode()는 전체 문자열을 한 번에 변환하고, raw_decode()는 변환된 객체와 함께 유효한 JSON 문서가 끝난 위치(index)까지 반환한다는 차이가 있습니다.
예제 코드
import json
my_str = '{"Asim": 25, "Priyesh": 23, "Asim": "28"}'
# JSONDecoder로 디코드
print(json.JSONDecoder().decode(my_str))
print(json.JSONDecoder().raw_decode(my_str))출력 결과
{'Asim': '28', 'Priyesh': 23}
({'Asim': '28', 'Priyesh': 23}, 44)핵심 정리
| 메서드/클래스 | 변환 방향 | 설명 |
|---|---|---|
| dump() | 객체 → 파일 | JSON 스트림을 파일 객체에 기록 |
| dumps() | 객체 → 문자열 | JSON 문자열 반환 |
| load() | 파일 → 객체 | 파일 객체에서 읽어 역직렬화 |
| loads() | 문자열 → 객체 | 문자열에서 역직렬화 |
| JSONEncoder | 객체 → JSON | default() 오버라이드로 커스텀 직렬화 지원 |
| JSONDecoder | JSON → 객체 | decode(), raw_decode() 제공 |