Skip to content

Instantly share code, notes, and snippets.

@aisipos
Created March 27, 2010 00:00
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save aisipos/345559 to your computer and use it in GitHub Desktop.
Save aisipos/345559 to your computer and use it in GitHub Desktop.
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
Copy link

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
Copy link

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

@gjask
Copy link

gjask commented Apr 20, 2016

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