Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 JSON 다루기: 직렬화와 역직렬화 완벽 가이드

JSON(JavaScript Object Notation)은 가볍고 폭넓게 채택된 데이터 교환 형식입니다. Python에서 JSON 형식화 기법을 활용하면 JSON 문자열을 Python 객체로 변환하거나, 그 반대로 Python 객체를 JSON 문자열로 변환할 수 있습니다.

이러한 기능을 사용하려면 Python의 json 모듈이 필요합니다. 이 모듈은 Python 표준 라이브러리에 포함되어 있으므로 별도 설치 없이 바로 가져와 사용할 수 있습니다.

import json

Python 객체를 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객체 → JSONdefault() 오버라이드로 커스텀 직렬화 지원
JSONDecoderJSON → 객체decode(), raw_decode() 제공