LINUX.ORG.RU

Python Make class JSONSerializable

 


0

2

Всем привет!

Столкнулся с задачей сделать свой класс json-сериализуемым. Что надо доопределить в классе base, чтобы все его наследники (и любая их иерархия) могли без проблем записываться в json?

import json
class base(object):
    pass

class foo(base):
    a=1

class bar(base):
    baz=foo()
    b=2

d=bar()
print(json.dump(d, indent=4))
★★

https://docs.python.org/2/library/json.html#encoders-and-decoders

Тебе не свой класс дописывать надо, а кастомный сериализатор писать. Из коробки json-модуль умеет сериализовать только примитивы, списки и словари.

hippi90 ★★★★★
()
Последнее исправление: hippi90 (всего исправлений: 1)
Ответ на: комментарий от aido

ещё и сериализатор

ты можешь в конструкторе JSONEncoder задать сериализатор, и далее использовать созданный JSONEncoder без лишних аргументов

MyTrooName ★★★★★
()
Ответ на: комментарий от aido

не хочется указывать в строке `json.dump(d, indent=4)` ещё и сериализатор

Используй свой кастомный json как декоратор над стандартным, или сделай monkey patch. Это питон, тут всё через жопу.

no-such-file ★★★★★
()

изминяюсь, а зачем это вообще? что за задача такая странная стоит, что нужен именно json?

genryRar ★★
()
Ответ на: комментарий от hippi90
class BaseCheckerEncoder(json.JSONEncoder):
    def default(self, o):
        return o.vars()
json._default_encoder=BaseCheckerEncoder

Object of type 'foo' is not JSON serializable

aido ★★
() автор топика
Ответ на: комментарий от hippi90

Так у тебя в коде наследования нет.

aido ★★
() автор топика
Ответ на: комментарий от aido

странно не задача сериализовать, а попытка использовать для этого json, который для этого совершенно не предназначен. для этого есть marshal (если у тебя полный контроль над средой на стороне евалинга) либо pickle (если этого контроля нема). оба идут в стандартной поставке, оба вполне справляются с простыми классами и без проблем допиливаются для сложных.

genryRar ★★
()

Возможно, ты хочешь что-то вроде marshmallow (особенно если нужна схема и валидация).

PS не обязательно брать именно marshmallow, это просто единственное что я знаю, так себе либа.

true_admin ★★★★★
()
5 марта 2020 г.

Make a Python Class JSON Serializable

The built-in json module of Python can only handle Python primitives types such as list, String, dict, numbers. to serialize arbitrary Python objects to JSON we need to build a custom encoder and S=specify it with the cls kwarg in json.dumps()

In Your case:

class BarEncoder(JSONEncoder):
        def default(self, o):
            return o.__dict__
			
json.dumps(d, indent=4, cls=BarEncoder)
alikrah29
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.