71
votes

Possible Duplicate:
Python serializable objects json

I need to know how to convert a dynamic python object into JSON. The object must be able to have multiple levels object child objects. For example:

class C(): pass
class D(): pass

c = C()
c.dynProperty1 = "something"
c.dynProperty2 = { 1, 3, 5, 7, 9 }
c.d = D()
c.d.dynProperty3 = "d.something"

# ... convert c to json ...

Using python 2.6 the following code:

import json

class C(): pass
class D(): pass

c = C()
c.what = "now?"
c.now = "what?"
c.d = D()
c.d.what = "d.what"

json.dumps(c.__dict__)

yields the following error:

TypeError: <__main__.D instance at 0x99237ec> is not JSON serializable

I don't know what types of subobjects a user might put into c. Is there a solution that is smart enough to detect if an attribute is an object and parse it's __dict__ automatically?

UPDATED to include subobjects on c.

4
except for the dynamic element--I don't know what properties might be added to the object before it is serialized into json. - Trevor
You'll notice the solution of the duplicate works in your case, too. - phihag
@phihag: thanks for pointing that out. It helped me realize there was more to my question than I thought (see updated question). - Trevor
Then you should probably ask a new question. Pay special notice not to include invalid example code. For example, you want class C(object): pass. I added an answer that should solve your problem. - phihag
Oops sorry, I was totally wrong. class C(): pass is of course valid, but it creates an old-style class (just like class C: pass would) in Python 2.x. old-style classes are strange beasts. By inheriting from object, you get the saner new-style behaviour. - phihag

4 Answers

133
votes

Specify the default= parameter (doc):

json.dumps(c, default=lambda o: o.__dict__)
16
votes
json.dumps(c.__dict__)

That will give you a generic JSON object, if that's what you're going for.

9
votes

Try using this package python-jsonpickle

Python library for serializing any arbitrary object graph into JSON. It can take almost any Python object and turn the object into JSON. Additionally, it can reconstitute the object back into Python.

0
votes

json.dumps expects a dictonary as a parameter. For an instance c, the attribute c.__dict__ is a dictionary mapping attribute names to the corresponding objects.