75

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"}]
2
  • 1
    You mean you want a JSON list? Commented Sep 25, 2014 at 7:49
  • Here I have 2 Json so I want only one with all the info like [{"city": "rouen", "name": "1, 2, 3 Soleil"}, {"city": "rouen", "name": "Maman, les p'tits bateaux"}] Commented Sep 25, 2014 at 7:51

3 Answers 3

149

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)
Sign up to request clarification or add additional context in comments.

15 Comments

your first solution works perfectly. Thanks a lot :)
That looks like a great solution. At the moment I'm trying to jsonify a complex data structure and this could be the way to go.
I haven't tried second solution Because your first solution worked for me :)
It should be noted that deserialization in this way becomes tricky (subnested objects will be dicts on json.loads.
@alper: yes, but you could have trivially figured that out by looking at the documentation.
|
18

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

Comments

6

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.