使用 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字符串
Python面试必考重点之数据存储第四关——如何将一个Python对象转换为对应的JSON字符串