Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
import simplejson as json
import lxml
class objectJSONEncoder(json.JSONEncoder):
"""A specialized JSON encoder that can handle simple lxml objectify types
>>> from lxml import objectify
>>> obj = objectify.fromstring("<Book><price>1.50</price><author>W. Shakespeare</author></Book>")
>>> objectJSONEncoder().encode(obj)
'{"price": 1.5, "author": "W. Shakespeare"}'
"""
def default(self,o):
if isinstance(o, lxml.objectify.IntElement):
return int(o)
if isinstance(o, lxml.objectify.NumberElement) or isinstance(o, lxml.objectify.FloatElement):
return float(o)
if isinstance(o, lxml.objectify.ObjectifiedDataElement):
return str(o)
if hasattr(o, '__dict__'):
#For objects with a __dict__, return the encoding of the __dict__
return o.__dict__
return json.JSONEncoder.default(self, o)
@dchandekstark

This comment has been minimized.

Copy link

@dchandekstark dchandekstark commented Nov 17, 2011

Thanks for sharing this solution. I have tweaked it to handle Unicode by replacing the str() call in L17 with:

unicode(o).encode('utf-8')

@TaoLinVT

This comment has been minimized.

Copy link

@TaoLinVT TaoLinVT commented Oct 30, 2012

I tried unicode(o).encode('utf-8'), but it does not keep "\n" text in output json. Any idea?

@gjask

This comment has been minimized.

Copy link

@gjask gjask commented Apr 20, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment