Serialize db.Blob in JSON
For a couple of days, I’ve been playing with google-app-engine. In order to build a JSON-based RESTful service, Google suggests a utility method to transform an object into JSON.
Unfortunately, this does not handle db/Blob entries, and fails with
<br />
UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 0: invalid start byte<br />
(I have a png image in my blob).
After struggling with it, I eventually found the fix (also posted on stackoverflow)
class GqlEncoder(json.JSONEncoder):
« » »Extends JSONEncoder to add support for GQL results and properties.
Adds support to simplejson JSONEncoders for GQL results and properties by
overriding JSONEncoder’s default method.
« » »
def default(self, obj):
if hasattr(obj, ‘\_\_json\_\_’):
return getattr(obj, ‘\_\_json\_\_’)()
if isinstance(obj, db.GqlQuery):
return list(obj)
elif isinstance(obj, db.Model):
properties = obj.properties().items()
output = {}
for field, value in properties:
data = getattr(obj, field)
if isinstance(data, str):
\# db.Blob inherits from str
data = data.encode(‘string-escape’)
output[field] = data
output[‘id’] = obj.key().id()
return output