Список объектов для JSON с Python

У меня проблема с преобразованием экземпляров 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 return, например:

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

Но мне бы хотелось, чтобы всего одна строка 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)

Ответ 2

Другим возможным решением этой проблемы является jsonpickle, который может быть использован для преобразования любого объекта Python в JSON (а не только простые списки).

На домашней странице jsonpickle:

jsonpickle - это библиотека Python для сериализации и десериализации сложных объектов Python в JSON и из него. Стандартный Python библиотеки для кодирования Python в JSON, такие как stdlibs json, simplejson и demjson, могут обрабатывать только примитивы Python, которые имеют прямой эквивалент JSON (например, dicts, списки, строки, ints и т.д.). jsonpickle строит поверх этих библиотек и позволяет более сложные структуры данных, которые будут сериализованы для JSON. jsonpickle очень настраиваемый и расширяемый, позволяющий пользователю выбирать JSON backend и добавить дополнительные серверы.

Выполнение преобразования прост:

import jsonpickle

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

Ответ 3

Как и в ответе @MartijnPieters, вы можете использовать параметр json.dumps default с лямбда-выражением, если не хотите создавать отдельную функцию: json.dumps(obj, default = lambda x: x.__dict__)