반응형
질문
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에서는 SimpleNamespace
과 object_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에서는 namedtuple
과 object_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)
만약 속성명으로 적합하지 않은 키를 처리하려면, namedtuple
의 rename
매개변수를 확인해보세요.
반응형
댓글