首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将JSON数据转换为Python对象?

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

Stack Overflow用户
提问于 2011-07-05 15:01:55
回答 29查看 572.3K关注 0票数 390

我想将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()

Python这样做很好,但是我如何处理复杂的数据?如果我能以某种方式将这个

  • 对象转换成一个易于使用的JSON对象,那会更好吗?
EN

回答 29

Stack Overflow用户

回答已采纳

发布于 2015-02-06 03:26:13

你可以试试这个:

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

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

只需创建一个新对象,并将参数作为map传递即可。

注意:它不适用于嵌套类。

你也可以有一个带有对象的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)
票数 119
EN

Stack Overflow用户

发布于 2013-04-08 22:40:18

更新

使用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 parameter

票数 549
EN

Stack Overflow用户

发布于 2011-07-05 15:19:05

请查看json module documentation中标题为专门化JSON对象解码的小节。您可以使用它将JSON对象解码为特定的Python类型。

下面是一个例子:

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

import json
def object_decoder(obj):
    if '__type__' in obj and obj['__type__'] == 'User':
        return User(obj['name'], obj['username'])
    return obj

json.loads('{"__type__": "User", "name": "John Smith", "username": "jsmith"}',
           object_hook=object_decoder)

print type(User)  # -> <type 'type'>

更新

如果您希望通过json模块访问字典中的数据,请执行以下操作:

user = json.loads('{"__type__": "User", "name": "John Smith", "username": "jsmith"}')
print user['name']
print user['username']

就像一本普通的字典。

票数 141
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6578986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档