Список объектов для 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__)