Простое кодирование JSON с помощью Python - PullRequest
5 голосов
/ 09 сентября 2010

Я довольно новичок в python (я использую python 3), и я пытаюсь сериализовать класс с одной строкой и двумя списками в качестве членов в JSon.Я обнаружил, что в стандарте Python есть библиотека json, но мне кажется, что мне нужно вручную реализовать метод сериализации.Есть ли кодировщик JSon, где я могу просто передать объект и получить сериализованный объект в виде строки без необходимости реализации метода сериализации.Пример:

class MyClass:
    pass

if __name__ == '__main__':
    my_name = "me"
    my_list = {"one","two"}
    my_obj = MyClass()
    my_obj.name = my_name;
    my_obj.my_list = my_list


    serialized_object = JSONserializer.serialize(my_obj).

Спасибо.

Ответы [ 3 ]

3 голосов
/ 09 сентября 2010

Как вы ожидаете, что библиотека json узнает, как сериализовать произвольные классы?

В вашем случае, если ваш класс достаточно прост, вы можете получить что-то вроде

foo = FooObject() # or whatever
json_string = json.dumps(foo.__dict__)

, чтобы просто сериализовать элементы объекта.

Тогда десериализация должна выглядеть примерно так:

foo_data = json.loads(json_string)
foo = FooObject(**foo_data)
3 голосов
/ 09 сентября 2010

Не знаю ничего заранее созданного, но вы можете написать его, если ваши объекты достаточно просты. Переопределите метод по умолчанию в JSONEncoder для просмотра inspect.getmembers (obj) (inspect - более читаемый способ получения наборов атрибутов в __dict__).

#!/usr/bin/env python3

import inspect
from json import JSONEncoder


class TreeNode:

    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right


class ObjectJSONEncoder(JSONEncoder):

    def default(self, reject):
        is_not_method = lambda o: not inspect.isroutine(o)
        non_methods = inspect.getmembers(reject, is_not_method)
        return {attr: value for attr, value in non_methods
                if not attr.startswith('__')}


if __name__ == '__main__':
    tree = TreeNode(42,
        TreeNode(24),
        TreeNode(242),
    )
    print(ObjectJSONEncoder().encode(tree))

Обновление: @Alexandre Deschamps говорит, что isroutine работает лучше, чем метод для некоторого ввода.

0 голосов
/ 09 сентября 2010

Как насчет JSONEncoder класса?

обновление

Я, должно быть, пропустил часть о данных, содержащихся в классе. Если вам нужна разумная сериализация произвольных объектов Python без необходимости расширять кодировщик, то, возможно, вы можете использовать комбинацию pickle и json. При травлении используйте протокол = 0, чтобы сериализовать данные как читабельный ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...