List of objects to JSON with Python

PythonJsonObjectSerialization

Python Problem Overview


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"}]

Python Solutions


Solution 1 - Python

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)

Solution 2 - Python

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

Solution 3 - Python

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpedroView Question on Stackoverflow
Solution 1 - PythonMartijn PietersView Answer on Stackoverflow
Solution 2 - PythonEric RomrellView Answer on Stackoverflow
Solution 3 - PythonStevenView Answer on Stackoverflow