simplejson.dumps (dict) выдает "не JSON-сериализуемый" - PullRequest
3 голосов
/ 22 января 2012

У меня есть словарь Python, где ключи - это строки, а значения - список объектов MyObject.Если я выполняю

simplejson.dumps(dict)

, выдается «MyObject not JSON serializable».

Как я могу избежать этого исключения и как сделать MyObject serializable?

1 Ответ

7 голосов
/ 25 января 2012

Правильный ответ

Чтобы сделать сериализуемую MyObject, вам необходимо реализовать метод, на который вы можете ссылаться в dumps. Например:

class MyObject:
    #    ...
    #    MyObject has 3 properties: name (a string), number (an int), and parent (a MyObject)
    @staticmethod
    def serialize(obj):
        return {
            "name":   obj.name,
            "number": obj.number,
            "parent": obj.parent
        }

    #    ...

simplejson.dumps(myObjInstance, default=MyObject.serialize)

Круто то, что dumps, как и любой другой JSON-сериализуемый объект, будет рекурсивно вызывать метод сериализации. Таким образом, obj.parent также будет сериализовано, без каких-либо дальнейших действий с вашей стороны.

Golf'd Version

Если все, что вы хотите сделать, это 1-1 сопоставить имена переменных экземпляра с их соответствующими значениями, вы можете использовать некоторую встроенную магию Python. Всякий раз, когда вы хотите сериализовать более сложный объект (опять же, только с использованием карты переменных-значений 1-1), просто вызовите эту строку:

simplejson.dumps(anyObj, default=lambda obj: obj.__dict__)

Для данного экземпляра MyObject он будет вести себя так же, как и вышеупомянутый serialize метод.

...