我是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 :(得分: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'