JSON data parsing in Python
Question:
How to convert JSON data to Python objects?
Background:
You receive a JSON data object from the Facebook API and want to store it in a database. The Django view you are currently using is represented by the following code:
response = request.POST user = FbApiUser(user_id = response['id']) user.name = response['name'] user.username = response['username'] user.save()
This works fine, but you want to know how to handle complex JSON data objects. You wish there was a way to convert that JSON object into a Python object for easier use.
Solution:
In Python 3 you can easily do this using SimpleNamespace and object_hook:
import json from types import SimpleNamespace data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}' # 将JSON解析为带有对应于dict键的属性的对象。 x = json.loads(data, object_hook=lambda d: SimpleNamespace(**d)) print(x.name, x.hometown.name, x.hometown.id)
In Python 2 , you can use namedtuple and object_hook (but this method is very slow for large number of nested objects):
import json from collections import namedtuple data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}' # 将JSON解析为带有对应于dict键的属性的对象。 x = json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values())) print x.name, x.hometown.name, x.hometown.id
To easily reuse this function, you can use the following code:
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)
If You want it to handle keys that are not valid property names, look at the rename parameter of namedtuple.
The above is the detailed content of How to Convert JSON Data to Python Objects?. For more information, please follow other related articles on the PHP Chinese website!