본문 바로가기
Python/Python FAQ

JSON 데이터를 Python 객체로 변환하는 방법은 무엇인가요?, How to convert JSON data into a Python object?

by 베타코드 2023. 10. 29.
반응형

질문


JSON 데이터를 Python 객체로 변환하고 싶습니다.

Facebook API에서 JSON 데이터 객체를 받고, 이를 데이터베이스에 저장하고 싶습니다.

현재 Django (Python)에서의 View (request.POST에 JSON이 포함됨):

response = request.POST
user = FbApiUser(user_id = response['id'])
user.name = response['name']
user.username = response['username']
user.save()
  • 이는 잘 작동하지만, 복잡한 JSON 데이터 객체를 어떻게 처리해야 할까요?
  • 만약 이 JSON 객체를 Python 객체로 변환하여 쉽게 사용할 수 있다면 훨씬 좋지 않을까요?

답변


업데이트

Python3에서는 SimpleNamespaceobject_hook을 사용하여 한 줄로 처리할 수 있습니다:

import json
from types import SimpleNamespace

data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'

# JSON을 딕셔너리 키에 해당하는 속성을 가진 객체로 파싱합니다.
x = json.loads(data, object_hook=lambda d: SimpleNamespace(**d))
print(x.name, x.hometown.name, x.hometown.id)

이전 답변 (Python2)

Python2에서는 namedtupleobject_hook을 사용하여 한 줄로 처리할 수 있습니다 (하지만 많은 중첩된 객체에서는 속도가 매우 느립니다):

import json
from collections import namedtuple

data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'

# JSON을 딕셔너리 키에 해당하는 속성을 가진 객체로 파싱합니다.
x = json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id

또는, 이를 쉽게 재사용하려면:

def _json_object_hook(d): return namedtuple('X', d.keys())(*d.values())
def json2obj(data): return json.loads(data, object_hook=_json_object_hook)

x = json2obj(data)

만약 속성명으로 적합하지 않은 키를 처리하려면, namedtuplerename 매개변수를 확인해보세요.

반응형

댓글