【问题标题】:Python classes to Yaml/JSON [closed]到 Yaml/JSON 的 Python 类 [关闭]
【发布时间】:2018-04-10 07:17:56
【问题描述】:

我对 YAML/JSON 不满意。

我缺少继承。

是否可以将 Python 类的层次结构导出到 YAML/JSON?

这样我可以使用我最喜欢的带有自动完成功能的 IDE 来构建我的数据结构。

在我的例子中,结果应该输入到 SaltStack 中。但这根本与配置管理无关,因为结果应该是纯 YAML/JSON。

我想将类导出到 yaml。永远只有类,永远不会有实例。至少我今天是这么认为的。

我认为使用这个约束是有意义的:类不会有方法,除了属性。并且只有 get-properties,从不 set-properties。

我从https://www.json2yaml.com/获取了示例json

{
  "json": [
    "rigid",
    "better for data interchange"
  ],
  "yaml": [
    "slim and flexible",
    "better for configuration"
  ],
  "object": {
    "key": "value",
    "array": [
      {
        "null_value": null
      },
      {
        "boolean": true
      },
      {
        "integer": 1
      }
    ]
  },
  "paragraph": "Blank lines denote\nparagraph breaks\n",
  "content": "Or we\ncan auto\nconvert line breaks\nto save space"
}

以下是上述 json 在 python 语法中的一个示例:

class json:
    data = ['rigi', 'better for data interchange']


class yaml:
    data = ['slim and flexible', 'better for configuration']


class object:
    key = 'value'
    array = [dict(null_value=None), dict(boolean=True), dict(integer=1)]


class paragraph:
    data = 'Blank lines denote\nparagraph breaks\n'


class content:
    data = '''Or we
can auto
convert line breaks
to save space'''

上面只是简单地介绍了如何使用 python 类创建数据结构。

【问题讨论】:

  • YAML 具有继承性。
  • 您要将类定义导出到YAML还是类实例
  • @flyx 我更新了问题:“我想将类导出到 yaml。永远只有类,永远不会有实例。至少我今天是这么想的。”
  • 好吧,那么问题是您要导出什么。只有层次结构还是关于类方法的信息?
  • @flyx 我更新了这个问题:“我认为使用这个约束是有意义的:类不会有方法,除了属性。只有 get-properties,从不 set-properties。”换句话说:类的层次结构和数据。

标签: python json inheritance yaml salt-stack


【解决方案1】:

您可以使用jsonpickle。请注意,使用 pickle 的安全警告也适用于 jsonpickle。如果您想允许反序列化任意对象,则必须处理安全隐患。

【讨论】:

    【解决方案2】:

    使用 json.Encoder ,扩展它以编写自定义类来解析 Python 类,如下所示..

    由于您可以拥有不同类型的对象,因此建议使用自定义编码器。

    例如。

    json.dumps(str)
    # TypeError: Object of type 'mappingproxy' is not JSON serializable
    

    我不确定你是否在寻找jsonpickle

    jsonpickle.dumps(str)
    >>'{"py/type": "__builtin__.str"}'
    
    jsonpickle.dumps(json.dumps)
    >>'{"py/function": "json.dumps"}'
    

    import json
    class ClassEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj, type1):
                return obj.conversion
            # .type2
            # .
            # .type3
            # .
            # .so on
            # .
            return json.JSONEncoder.default(self, obj)
    
    dict_str = json.dumps(class_object, cls=ClassEncoder)
    

    从 dict_str 也将其转储到 YAML。

    yaml.dump(dict_str)
    

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 2013-01-25
      • 1970-01-01
      • 2017-03-16
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      相关资源
      最近更新 更多