将JSON解码为python对象

时间:2017-05-21 12:27:58

标签: python json deserialization

我是python的新手,并且遇到了将JSON解码为Python类的问题。例如:

如果我们有一个代表人的python类:

Class Person:
    def __init__(self, Fname, Lname, Age):
        self.FirstName = Fname
        self.LastName = Lname
        self.Age = Age

现在我有一个JSON,让我们说,例如我从Web服务机构或其他东西得到它,它是这样的:

JsonOBJ = {"FirstName":"Mostafa","LastName":"Mohamed","Age":"26"}

我需要解码该JSON以使Person类型的对象充满值并访问其属性,如:

Obj.FirstName

感谢。

2 个答案:

答案 0 :(得分:1)

如果您已将JSON字符串作为Python字典,则可以使用**简单地展开它:

p = Person(**{'Fname': 'a', 'Lname': 'b', 'Age': 11})
print(p.FirstName)
# a

如果您不这样做,另一个选择是创建一个知道如何从JSON字符串创建Person对象的类方法。这样,创建逻辑以某种方式封装在调用代码中:

class Person:
    def __init__(self, Fname, Lname, Age):
        self.FirstName = Fname
        self.LastName = Lname
        self.Age = Age

    @classmethod
    def from_json_string(cls, json_string):
        dict_obj = json.loads(json_string)
        return cls(**dict_obj)

p = Person.from_json_string('{"Fname": "a", "Lname": "b", "Age": 11}')

print(p.FirstName)
# a

请记住,我展示的两种方法都使用**将字典扩展为Person.__init__的单个参数。这意味着键必须与__init__期望的参数匹配。如果他们不这样做,您需要将正确的键/值传递给__init__,而不是使用**

答案 1 :(得分:1)

您是否需要全班实施?如果您只是想通过键而不是使用dict访问属性,则可以创建一个namedtuple。

from collections import namedtuple

def dict_to_namedtuple(d):
    # This sets up a namedtuple called 'Person' with the provided keys
    # It then creates the namedtuple with the unpacked dict
    return namedtuple('Person', d.keys())(**d)

d = {"FirstName":"Mostafa","LastName":"Mohamed","Age":"26"}
person = dict_to_named_tuple(d)

print(person)
# Person(FirstName='Mostafa', LastName='Mohamed', Age='26')

print(person.FirstName)
# 'Mostafa'