Простое кодирование JSON с помощью Python

Я довольно новичок в python (я использую python 3), и я пытаюсь сериализовать класс с одной строкой и двумя списками в качестве членов JSon. Я обнаружил, что в стандарте python есть json lib, но кажется, что мне нужно вручную реализовать метод сериализации. Есть ли 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). 

Спасибо.

  • маршал сбрасывается быстрее, cPickle быстрее загружается
  • Как сделать класс JSON сериализуемым
  • Какая разница между pickle и _pickle в python 3?
  • Django JSON Сериализация с смешанными моделями Django и словарь
  • Файл конфигурации со списком пар ключ-значение в python
  • Создание объекта JSON, сериализуемого с помощью обычного кодировщика
  • Доступ к словарю по ключу в шаблоне Django
  • Python - Строка в список
  • Как получить данные JSON из службы RESTful с помощью Python?
  • Python: попытка десериализации нескольких объектов JSON в файле с каждым объектом, охватывающим несколько, но последовательно расположенных строк
  • Как изменить поведение кодировки json для сериализуемого объекта python?
  • scrapy от выхода скрипта в json
  • 3 Solutions collect form web for “Простое кодирование JSON с помощью Python”

    Не знаю ничего заранее подготовленного, но вы можете написать его, если ваши объекты достаточно просты. Переопределите метод по умолчанию в JSONEncoder, чтобы посмотреть на inspect.getmembers (obj) (проверка является более читаемым способом получения наборов атрибутов в __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 работает лучше, чем метод для некоторого ввода.

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

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

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

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

    Тогда десериализация должна быть чем-то вроде

     foo_data = json.loads(json_string) foo = FooObject(**foo_data) 

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

    Обновить

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

    Python - лучший язык программирования в мире.