创建一个Python类,我可以将其序列化为一个嵌套的JSON obj

2024-06-25 23:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python类和JSON的初学者,我不确定我的方向是否正确。在

基本上,我有一个web服务,它在POST主体中接受JSON请求,如下所示:

{ "item" : 
     {
     "thing" : "foo",
     "flag" : true,
     "language" : "en_us"
     },
   "numresults" : 3
}

我开始为“item”创建一个类,如下所示:

^{pr2}$

所以,我的问题是:

  1. 我走的方向对吗?在
  2. 如何将Python对象转换为JSON字符串?在

我在python中找到了很多关于JSON的信息,我研究了jsonpickle,但我似乎无法创建一个最终输出所需嵌套字典的类。在

编辑: 多亏了Joran的建议,我坚持使用属性类,并添加了如下方法:

    def jsonify(self):
        return json.dumps({ "item" :  self.__dict__ }, indent=4)

这一切都很成功。在

谢谢大家的帮助。在


Tags: selfwebjsontruefoo方向itempost
1条回答
网友
1楼 · 发布于 2024-06-25 23:20:20

只需向返回字典的类添加一个方法

def jsonify(self):
    return { 'Class Whatever':{
              'data1':self.data1,
               'data2':self.data2,
               ...
                               }

     }

并对结果调用tojson函数。。。或者在返回之前调用它以返回json结果。。。在

网友
2楼 · 发布于 2024-06-25 23:20:20

看看^{} project;它让您定义一个面向对象的“schema”,它可以轻松地在JSON和JSON之间序列化。在

import colander

class Item(colander.MappingSchema):
    thing = colander.SchemaNode(colander.String(),
                                validator=colander.OneOf(['foo', 'bar']))
    flag = colander.SchemaNode(colander.Boolean())
    language = colander.SchemaNode(colander.String()
                                   validator=colander.OneOf(supported_languages)

class Items(colander.SequenceSchema):
    item = Item()

然后从JSON加载:

^{pr2}$

并且colander为您验证数据,返回一组python对象,然后可以对这些对象执行操作。在

或者,您必须创建特定的每对象处理,以便能够将Python对象转换为JSON结构,反之亦然。在

网友
3楼 · 发布于 2024-06-25 23:20:20

colander和dict的建议都很好。在

我只想补充一下,你应该退一步,决定如何使用这些对象。
这种通用方法的一个潜在问题是,您需要一个列表、函数或其他一些映射来决定导出哪些属性。(在colander定义和jsonify定义中可以看到这一点)。在

你可能想要这种行为,也可能不想要。在

例如,sqlalchemy项目有一些类,这些类是用像离子滤器一样的特征字段名定义的。但是对象本身存储了大量与数据库和数据库连接相关的辅助数据。在

为了只访问您关心的基础字段数据,您需要访问包装数据的私有内部dict,或者查询类中映射的列:

def columns_as_dict(self):
    return dict((col.name, getattr(self, col.name)) for col in sqlalchemy_orm.class_mapper(self.__class__).mapped_table.c)

我并不是想把这件事搞得太复杂,我只是想建议你仔细考虑一下如何使用这些对象。如果你只想从你放进去的对象中得到相同的信息,那么一个简单的解决方案就可以了。但是,如果这些对象将具有其他类型的“私有”数据,则可能需要在不同类型的信息之间保持某种区别。在

相关问题 更多 >