Marshmallow: как сериализовать dict или объект в XML?

Я новичок в модуле Python Marshmallow, и мне очень нравится сериализация и десериализация. Я знаю, что после определения схемы я могу легко сериализовать словарь или объект в формат JSON, используя метод schema.dumps.

Однако мне интересно, как я могу сериализовать объект или дикт в другой формат, чем JSON. Например, иногда мне нужно сериализовать объект в XML.

Я видел эту проблему в репозитории Marshmallow на Github. Кажется, это выполнимо, играя с чем-то под названием json_module. Однако я не могу следить за этой темой, потому что я новичок в Marshmallow.

Логически, schema.dumps кажется правильным методом для этого, но из документация, я не видел возможности сериализации данных в какой-либо другой формат, кроме JSON.

Я был бы признателен, если бы кто-нибудь мог привести мне пример преобразования dict в строку XML.

Изменить: спасибо за ответ, используя dicttoxml. Это хороший модуль, и он действительно решает мою проблему. Однако разве «управление форматом вывода» не является встроенной функцией marshmallow? Я думал, что если бы это было так, то поддержка управления форматом вывода должна быть в методе schema.dumps? Или я что-то пропустил?


person Zheng Liu    schedule 11.09.2019    source источник
comment
Marshmallow по существу независим от формата. Он выводит структуру словарей и списков Python, которые затем можно сериализовать в JSON или любой другой формат по вашему выбору.   -  person Martijn Pieters    schedule 11.09.2019
comment
Так что нет, Marshmallow не дает вам контроля над форматом вывода, кроме того, что вы можете контролировать, как атрибуты объекта сопоставляются с парами ключ-значение в выходных словарях. Цель состоит в том, чтобы создать выходные данные, которые тривиально сериализовать, независимо от выбранного вами метода сериализации. Обычно это JSON, но могут быть и YAML, XML, CSV или другие форматы.   -  person Martijn Pieters    schedule 11.09.2019
comment
Спасибо, Мартин. Думаю, я не понял, что на самом деле означает слово «независимый от формата», когда впервые увидел его в документации Marshmallow. Тогда чем же на самом деле хорош зефир? Для меня осталось в основном только проверка и, возможно, трансформация. Так, например, как вы сравниваете зефир с цербером?   -  person Zheng Liu    schedule 11.09.2019
comment
Да, он хорош именно в этом, валидации и трансформации. Он помещает данные из потенциально сложных объектов (пользовательских классов и т. д.) в структуру списков и словарей и может делать то же самое в обратном порядке.   -  person Martijn Pieters    schedule 11.09.2019
comment
Я не знаком с Cerberus, но на первый взгляд он занимается только валидацией. В этом пространстве есть и другие пакеты, такие как collander.   -  person Martijn Pieters    schedule 11.09.2019


Ответы (1)


Согласно ответу здесь. Вы всегда можете просто опубликовать обработку json в xml, используя библиотеку. Попробуйте dicttoxml

import json
from dicttoxml import dicttoxml
marshmallow_json_string = schema.dumps
marshmallow_dict = json.loads(marshmallow_json_string)
marshmallow_xml = dicttoxml(marshmallow_dict)
person Jesse Reza Khorasanee    schedule 11.09.2019
comment
Это очень многообещающий ответ. Большое спасибо. Тем не менее, я чувствую, что это должно было быть встроено в зефир, не так ли? Может быть, я неправильно понимаю зефир, но я думал, что он может контролировать формат ввода, выполнять преобразование и контролировать формат вывода? - person Zheng Liu; 11.09.2019
comment
Возможно, я не слишком уверен, я не знаю, как пользователи обычно используют пакет. В любом случае, я думаю, вы на правильном пути, говоря об этом в проблемах github для репо. Разработчики, знающие цель проекта, могут рассказать вам, почему они его включили/не включили. - person Jesse Reza Khorasanee; 11.09.2019
comment
Взгляните на эту проблему, где кто-то принимает json и выводит yaml. Я думаю, это то, что вам может понадобиться, но для xml. - person Jesse Reza Khorasanee; 11.09.2019
comment
Спасибо Джесси. Я думаю, что ссылка, которую вы предоставили, действительно помогла мне. Я поставлю это как ответ. Оглядываясь назад, я действительно упустил то, как использовать метод render_module :) - person Zheng Liu; 11.09.2019