使用 Python 转换为 JSON 的对象列表

Posted

技术标签:

【中文标题】使用 Python 转换为 JSON 的对象列表【英文标题】:List of objects to JSON with Python 【发布时间】:2014-11-19 21:52:07 【问题描述】:

我在将 Object 实例转换为 JSON 时遇到问题:

ob = Object()

list_name = scaping_myObj(base_url, u, number_page)

for ob in list_name:
   json_string = json.dumps(ob.__dict__)
   print json_string

list_name 我有一个Object 实例列表。

json_string返回,例如:

"city": "rouen", "name": "1, 2, 3 Soleil"
"city": "rouen", "name": "Maman, les p'tits bateaux"

但我只想要 1 个 JSON 字符串,其中包含列表中的所有信息:

["city": "rouen", "name": "1, 2, 3 Soleil", "city": "rouen", "name": "Maman, les p'tits bateaux"]

【问题讨论】:

你的意思是你想要一个 JSON 列表? 这里我有 2 个 Json,所以我只想要一个包含所有信息,例如 ["city": "rouen", "name": "1, 2, 3 Soleil", "city ": "rouen", "name": "Maman, les p'tits bateaux"] 【参考方案1】:

您可以使用列表推导生成字典列表,然后将其转换:

json_string = json.dumps([ob.__dict__ for ob in list_name])

或使用default 函数; json.dumps() 会为它无法序列化的任何东西调用它:

def obj_dict(obj):
    return obj.__dict__

json_string = json.dumps(list_name, default=obj_dict)

后者适用于在结构的任何级别插入的对象,而不仅仅是在列表中。

就个人而言,我会使用像marshmallow 这样的项目来处理更复杂的事情;例如处理您的示例数据可以使用

from marshmallow import Schema, fields

class ObjectSchema(Schema):
    city = fields.Str()
    name = fields.Str()

object_schema = ObjectSchema()
json_string = object_schema.dumps(list_name, many=True)

【讨论】:

您的第一个解决方案完美运行。非常感谢:) 这看起来是个不错的解决方案。目前我正在尝试 jsonify 一个复杂的数据结构,这可能是要走的路。 我没有尝试过第二个解决方案因为你的第一个解决方案对我有用:) 需要注意的是,这种方式的反序列化变得很棘手(子嵌套对象将是json.loads上的dicts。 @SkyLeach:是的;一种约定是使用对象类型向字典添加一个额外的键(例如`_type':'ObjectType'),然后在反序列化时遍历字典以检测这些。还是有点痛。【参考方案2】:

这个问题的另一种可能的解决方案是jsonpickle,它可用于将任何 Python 对象转换为 JSON(不仅仅是简单的列表)。

jsonpickle 主页:

jsonpickle 是一个用于序列化和反序列化的 Python 库 与 JSON 之间的复杂 Python 对象。标准的 Python 用于将 Python 编码为 JSON 的库,例如 stdlib 的 json, simplejson 和 demjson 只能处理具有 直接 JSON 等价物(例如 dicts、lists、strings、ints 等)。 jsonpickle 构建在这些库之上并允许更复杂的 要序列化为 JSON 的数据结构。 jsonpickle 高度 可配置和可扩展——允许用户选择 JSON 后端并添加其他后端。

执行转换很简单:

import jsonpickle

class JsonTransformer(object):
    def transform(self, myObject):
        return jsonpickle.encode(myObject, unpicklable=False)

【讨论】:

【参考方案3】:

与@MartijnPieters 的回答类似,如果您不想创建单独的函数,则可以将 json.dumps default 参数与 lambda 一起使用: json.dumps(obj, default = lambda x: x.__dict__)

【讨论】:

以上是关于使用 Python 转换为 JSON 的对象列表的主要内容,如果未能解决你的问题,请参考以下文章

Python每日一练——数据存储第四关:如何将一个Python对象转换为对应的JSON字符串

使用jackson将json对象列表转换为hashmap

Python面试必考重点之数据存储第四关——如何将一个Python对象转换为对应的JSON字符串

Kotlin 使用 Gson 将 json 字符串转换为对象列表

如何在python中将光标列表转换为JSON格式?

如何在 Angular 2 中将对象转换为 JSON 列表?