Python中的JSON数据解析
问题:
如何将JSON数据转换为Python对象?
背景:
您从Facebook API接收JSON数据对象,并希望将其存储在数据库中。您当前正在使用的Django视图以以下代码表示:
response = request.POST user = FbApiUser(user_id = response['id']) user.name = response['name'] user.username = response['username'] user.save()
这可以正常工作,但您想知道如何处理复杂JSON数据对象。您希望有一种方法将该JSON对象转换为Python对象以简化使用。
解决方案:
在Python 3中,您可以使用SimpleNamespace和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)
在Python 2中,可以使用namedtuple和object_hook(但对于大量嵌套对象,此方法非常慢):
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
要轻松重用此功能,可以使用以下代码:
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参数。
以上是如何将 JSON 数据转换为 Python 对象?的详细内容。更多信息请关注PHP中文网其他相关文章!