使用Python将对象列表添加到JSON

时间:2014-09-25 07:46:20

标签: python json object serialization

我在将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"}]

3 个答案:

答案 0 :(得分:59)

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

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)

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

答案 1 :(得分:3)

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

来自 jsonpickle 主页:

  

jsonpickle是一个用于序列化和反序列化的Python库   复杂的Python对象与JSON之间的关系。标准的Python   用于将Python编码为JSON的库,例如stdlib的json,   simplejson和demjson只能处理有原型的Python原语   直接JSON等价物(例如,词典,列表,字符串,整数等)。   jsonpickle构建在这些库之上,允许更复杂   要序列化为JSON的数据结构。 jsonpickle很高兴   可配置和可扩展 - 允许用户选择JSON   后端并添加额外的后端。

执行转换很简单:

import jsonpickle

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

答案 2 :(得分:1)

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