Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List of objects to JSON with Python

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"}] 
like image 476
pedro Avatar asked Sep 25 '14 07:09

pedro


2 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) 
like image 145
Martijn Pieters Avatar answered Oct 02 '22 04:10

Martijn Pieters


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

like image 31
Eric Romrell Avatar answered Oct 02 '22 05:10

Eric Romrell