1. 편지 봉투 씌우기: JSON 인코딩과 디코딩

JSON은 사실 아주 단순하고 긴 ‘문자열’입니다. 중괄호 { } 와 대괄호 [ ] 만 사용해서 파이썬의 딕셔너리나 리스트와 거의 비슷하게 생겼지만, 약간의 차이가 있습니다.

파이썬 자료형 JSON 으로 변하면?
dict (딕셔너리) object { }
list, tuple array [ ]
str (문자열) string " "
True, False true, false (소문자로 변형!)
None null (아무것도 없다는 뜻)

1.1 파이썬을 JSON 봉투에 담기 (인코딩, dumps)

파이썬의 살아 움직이는 리스트나 딕셔너리를, 다른 컴퓨터로 전송하기 위해 텍스트 문자열(JSON)로 납작하게 찍어내는 마법 주문이 json.dumps() 입니다.

import json

my_bag = {"name": "용사", "level": 10, "is_alive": True}

# 딕셔너리를 JSON 텍스트로 납작하게 변환! (인코딩)
json_text = json.dumps(my_bag)

print(type(json_text)) # <class 'str'> 문자열로 바뀜!
print(json_text)       
# 출력: {"name": "\uc6a9\uc0ac", "level": 10, "is_alive": true}
# (True가 true로 소문자로 바뀐 걸 확인하세요!)

보기 예쁘게 줄바꿈을 하려면 indent=4 같은 도구를 추가하면 됩니다.


1.2 봉투 뜯어서 파이썬으로 조립하기 (디코딩, loads)

인터넷 너머로 날아온 낯선 JSON 문자열을 받았다면, 이걸 다시 우리가 쓰기 편한 파이썬 딕셔너리로 뻥 튀겨야 합니다. 이 주문은 json.loads() (문자열에서 로드한다는 뜻의 s가 붙어요!) 입니다.

import json

# 다른 곳에서 날아온 JSON 텍스트 편지
incoming_json = '{"score": 99, "items": ["sword", "shield"]}'

# 파이썬에서 써먹을 수 있는 딕셔너리로 부활! (디코딩)
py_data = json.loads(incoming_json)

print(type(py_data))       # <class 'dict'>
print(py_data["items"][0]) # 출력: sword ! 잘 조립되었네요!

1.3 내 로봇(클래스)도 JSON으로 보낼 수 있을까?

기본적으로 딕셔너리나 리스트만 JSON이 될 수 있습니다. 여러분이 새로 설계한 로봇(클래스) 객체를 넣으면 에러를 뿜어냅니다! 이때 “야, 내 로봇 객체는 내부의 __dict__ 라는 설명서를 보고 딕셔너리 흉내를 내서 던져라!” 라고 해결해주는 도우미 함수를 심어놓을 수 있습니다.

import json

class Robot:
    def __init__(self, name):
        self.name = name

# 도우미 함수: 클래스의 내부 속성 딕셔너리를 던져준다!
def robot_to_dict(obj):
    return obj.__dict__ 

my_bot = Robot("RX-78")

# 에러 없이 my_bot 객체를 JSON으로 인쇄해 냄!
print(json.dumps(my_bot, default=robot_to_dict))
# 출력: {"name": "RX-78"}
서브목차