【问题标题】:Decode JSON into a python object将 JSON 解码为 python 对象
【发布时间】:2023-03-10 16:48:01
【问题描述】:

我是 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

谢谢。

【问题讨论】:

    标签: python json deserialization


    【解决方案1】:

    您是否有理由需要完整的类实现?如果您只是想通过键访问属性而不使用字典,您可以创建一个命名元组。

    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'
    

    【讨论】:

    • 谢谢...工作得很好,我只需要先将 JSON 字符串转换为字典。谢谢大佬
    【解决方案2】:

    如果您已经将 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__,而不是使用**

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2017-09-13
      相关资源
      最近更新 更多