【问题标题】:Json to custom objekt in PythonJson 到 Python 中的自定义对象
【发布时间】:2021-12-14 10:31:58
【问题描述】:

所以我遇到了一个我不知道如何解决的问题。

我想从 JSON 文件中加载对象并将它们转换为 python 中的特定对象。 例如,我得到了一些这样的 JSON:

{
   "Class1":{
        "name":"str",
        "value":float,
        "description":"str",
        etc.
        },

   "Class2":{
        "name":"str",
        "value":float,
        "description":"str"
        }
}

还有一些像这样的 Python 代码:

class Class1:
    name:str
    value:float
    description:str

class Class2(Class1):
    def someMethod(self):
        pass

如何在它所属的类中以最简单的方式将其转换?

我已经在网上找到了一些解决方案,但它们需要为每个班级定制一个编码器。但我想要一个创建所有对象的函数。

【问题讨论】:

  • 请注意"value":float 不是有效的 JSON

标签: python json object


【解决方案1】:

dataclass 应该可以完成这项工作。 数据类的构造函数可以轻松处理数据。

from dataclasses import dataclass

@dataclass
class Class1:
    name:str
    value:float
    description:str

@dataclass
class Class2(Class1):
    def someMethod(self):
        pass

data ={
   "Class1":{
        "name":"str",
        "value":1.0,
        "description":"str",
         },

   "Class2":{
        "name":"str",
        "value":2.0,
        "description":"str"
        }
}


for k, vals in data.items():
    print(locals()[k](**vals))

# Class1(name='str', value=1.0, description='str')
# Class2(name='str', value=2.0, description='str')

【讨论】:

  • 非常感谢 :) 这正是我所需要的。
【解决方案2】:

您可以使用 Glauco 已经提到的dataclasses。如果您打算以您提到的样式从 json 生成它们,下面是一个示例方法。

from dataclasses import make_dataclass
from pydoc import locate

definitions = {
    "Class1": {
        "name": "str",
        "value": "float",
        "description": "str",
    },

    "Class2": {
        "name": "str",
        "value": "float",
        "description": "str"
    }
}


def make_class(name, definition):
    def_fields = [(name, locate(typ)) for name, typ in definition.items()]
    return make_dataclass(name, def_fields)


classes = [make_class(name, definition) for name, definition in definitions.items()]

【讨论】:

  • 感谢您的回答,我真的不明白 make_class 函数的作用。它会从 json 中创建一个全新的数据类吗?
  • 会的。不确定,如果我理解错了你的问题。
  • 我尝试仅从 json 加载数据,而不是创建新类。但是知道这是可能的会很有用。谢谢!
【解决方案3】:

使用数据类

from dataclasses import dataclass
data = {
   "clazz_1":{
        "name":"jack",
        "value":12.5,
        "description":"desc1",
        },

   "clazz_2":{
        "name":"jim",
        "value":45.77,
        "description":"desc2"
        }
}
@dataclass
class A:
  name:str
  value: float
  description: str


@dataclass
class B:
  name:str
  value: float
  description: str

@dataclass
class Parent:
  clazz_1: A
  clazz_2: B 


p: Parent = Parent(**data)
print(p)

输出

Parent(clazz_1={'name': 'jack', 'value': 12.5, 'description': 'desc1'}, clazz_2={'name': 'jim', 'value': 45.77, 'description': 'desc2'})

【讨论】:

  • 感谢您的回答,但这不是我想做的。
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 2020-05-16
  • 1970-01-01
  • 2019-02-23
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多