2017-05-21 41 views
-1

我是新来的python,并将JSON解码为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 

谢谢。

回答

0

是否有理由需要全班实施?如果你只是想通过键访问属性而不使用字典,你可以创建一个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' 
+0

谢谢...工作完美,我只需要将JSON字符串转换为字典第一。谢啦 – Mostafa

2

如果你已经有了JSON字符串Python字典,你可以使用**简单地扩展它:

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

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

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__而不是使用**