如何将 JSON 数据转换为 Python 对象?

新手上路,请多包涵

我想将 JSON 数据转换为 Python 对象。

我从 Facebook API 接收 JSON 数据对象,我想将其存储在我的数据库中。

我当前在 Django (Python) 中的视图( 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 对象以便于使用,那不是更好吗?

原文由 Sai Krishna 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 705
2 个回答

你可以试试这个:

 class User(object):
    def __init__(self, name, username):
        self.name = name
        self.username = username

import json
j = json.loads(your_json)
u = User(**j)

只需创建一个新对象,并将参数作为映射传递。


你也可以有一个带有对象的 JSON:

 import json
class Address(object):
    def __init__(self, street, number):
        self.street = street
        self.number = number

    def __str__(self):
        return "{0} {1}".format(self.street, self.number)

class User(object):
    def __init__(self, name, address):
        self.name = name
        self.address = Address(**address)

    def __str__(self):
        return "{0} ,{1}".format(self.name, self.address)

if __name__ == '__main__':
    js = '''{"name":"Cristian", "address":{"street":"Sesame","number":122}}'''
    j = json.loads(js)
    print(j)
    u = User(**j)
    print(u)

原文由 cmaluenda 发布,翻译遵循 CC BY-SA 4.0 许可协议

更新

使用 Python3,您可以使用 SimpleNamespaceobject_hook 在一行中完成:

 import json
from types import SimpleNamespace

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

# Parse JSON into an object with attributes corresponding to dict keys.
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}}'

# Parse JSON into an object with attributes corresponding to dict keys.
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 参数

原文由 DS. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题