Codificación JSON fácil con Python

Soy bastante nuevo en python (uso python 3), y estoy tratando de serializar una clase con una cadena y dos listas como miembros en JSon. Encontré que hay un json lib en el estándar de python pero parece que necesito implementar manualmente un método de serialización. ¿Existe un codificador JSon en el que simplemente pueda pasar un objeto y recibir el objeto serializado como una cadena sin tener que implementar un método de serialización? Ejemplo:

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). 

Gracias.

No sabe nada de preconstruido, pero puede escribir uno si sus objetos son lo suficientemente simples. Reemplace el método predeterminado en JSONEncoder para ver inspect.getmembers (obj) (inspeccionar es una forma más legible de obtener conjuntos de atributos en __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)) 

Actualización: @Alexandre Deschamps dice que isroutine funciona mejor que el método para alguna entrada.

¿Cómo espera que la biblioteca json sepa cómo serializar clases arbitrarias?

En tu caso, si tu clase es lo suficientemente simple, podrías escapar de algo como

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

para simplemente serializar los miembros del objeto.

La deserialización tendría que ser algo así como

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

¿Qué hay de la clase JSONEncoder ?

actualizar

Debo haber omitido la parte sobre los datos contenidos en una clase. Si quieres una serialización sensata de objetos Python arbitrarios sin la necesidad de extender el codificador, entonces quizás puedas usar una combinación de pickle y json . Al realizar el decapado, use el protocolo = 0 para serializar los datos como ASCII legible por el ser humano.