List of objects to JSON with Python
Question:
I have a problem converting Object
instances to JSON:
ob = Object()
list_name = scaping_myObj(base_url, u, number_page)
for ob in list_name:
json_string = json.dumps(ob.__dict__)
print json_string
In list_name
I have a list of Object
instances.
json_string
return, for example:
{"city": "rouen", "name": "1, 2, 3 Soleil"}
{"city": "rouen", "name": "Maman, les p'tits bateaux"}
But I would like just 1 JSON string with all the info in a list:
[{"city": "rouen", "name": "1, 2, 3 Soleil"}, {"city": "rouen", "name": "Maman, les p'tits bateaux"}]
Answers:
You can use a list comprehension to produce a list of dictionaries, then convert that:
json_string = json.dumps([ob.__dict__ for ob in list_name])
or use a default
function; json.dumps()
will call it for anything it cannot serialise:
def obj_dict(obj):
return obj.__dict__
json_string = json.dumps(list_name, default=obj_dict)
The latter works for objects inserted at any level of the structure, not just in lists.
Personally, I’d use a project like marshmallow to handle anything more complex; e.g. handling your example data could be done with
from marshmallow import Schema, fields
class ObjectSchema(Schema):
city = fields.Str()
name = fields.Str()
object_schema = ObjectSchema()
json_string = object_schema.dumps(list_name, many=True)
Another possible solution to this problem is jsonpickle which can be used to transform any Python object into JSON (not just simple lists).
From the jsonpickle home page:
jsonpickle is a Python library for serialization and deserialization
of complex Python objects to and from JSON. The standard Python
libraries for encoding Python into JSON, such as the stdlib’s json,
simplejson, and demjson, can only handle Python primitives that have a
direct JSON equivalent (e.g. dicts, lists, strings, ints, etc.).
jsonpickle builds on top of these libraries and allows more complex
data structures to be serialized to JSON. jsonpickle is highly
configurable and extendable–allowing the user to choose the JSON
backend and add additional backends.
Performing a transformation is simple:
import jsonpickle
class JsonTransformer(object):
def transform(self, myObject):
return jsonpickle.encode(myObject, unpicklable=False)
Similar to @MartijnPieters’ answer, you can use the json.dumps default
parameter with a lambda, if you don’t want to have to create a separate function:
json.dumps(obj, default = lambda x: x.__dict__)
I have a problem converting Object
instances to JSON:
ob = Object()
list_name = scaping_myObj(base_url, u, number_page)
for ob in list_name:
json_string = json.dumps(ob.__dict__)
print json_string
In list_name
I have a list of Object
instances.
json_string
return, for example:
{"city": "rouen", "name": "1, 2, 3 Soleil"}
{"city": "rouen", "name": "Maman, les p'tits bateaux"}
But I would like just 1 JSON string with all the info in a list:
[{"city": "rouen", "name": "1, 2, 3 Soleil"}, {"city": "rouen", "name": "Maman, les p'tits bateaux"}]
You can use a list comprehension to produce a list of dictionaries, then convert that:
json_string = json.dumps([ob.__dict__ for ob in list_name])
or use a default
function; json.dumps()
will call it for anything it cannot serialise:
def obj_dict(obj):
return obj.__dict__
json_string = json.dumps(list_name, default=obj_dict)
The latter works for objects inserted at any level of the structure, not just in lists.
Personally, I’d use a project like marshmallow to handle anything more complex; e.g. handling your example data could be done with
from marshmallow import Schema, fields
class ObjectSchema(Schema):
city = fields.Str()
name = fields.Str()
object_schema = ObjectSchema()
json_string = object_schema.dumps(list_name, many=True)
Another possible solution to this problem is jsonpickle which can be used to transform any Python object into JSON (not just simple lists).
From the jsonpickle home page:
jsonpickle is a Python library for serialization and deserialization
of complex Python objects to and from JSON. The standard Python
libraries for encoding Python into JSON, such as the stdlib’s json,
simplejson, and demjson, can only handle Python primitives that have a
direct JSON equivalent (e.g. dicts, lists, strings, ints, etc.).
jsonpickle builds on top of these libraries and allows more complex
data structures to be serialized to JSON. jsonpickle is highly
configurable and extendable–allowing the user to choose the JSON
backend and add additional backends.
Performing a transformation is simple:
import jsonpickle
class JsonTransformer(object):
def transform(self, myObject):
return jsonpickle.encode(myObject, unpicklable=False)
Similar to @MartijnPieters’ answer, you can use the json.dumps default
parameter with a lambda, if you don’t want to have to create a separate function:
json.dumps(obj, default = lambda x: x.__dict__)