[storm] How to JSON encode a item from a ResultSet
Mario Zito
mazito at analyte.com
Thu May 27 22:08:57 BST 2010
Jamu:
Ok, it works with VERY minor corrections:
The resulting code is:
*def encode_storm_object(object):*
* if not hasattr(object, "__storm_table__"):*
* raise TypeError(repr(object) + " is not JSON serializable")*
*
*
* result = {}*
* cls_info = get_cls_info(object.__class__)*
* for name in cls_info.attributes.iterkeys():*
* result[name] = getattr(object, name)*
* return result*
Only errors were "hassattr" with two "ss" and "__storm_table" corrected to
"__storm_table__"
Thanks again !
Mario
2010/5/27 Jamu Kakar <jkakar at kakar.ca>
> Hi Mario,
>
> On Thu, May 27, 2010 at 10:14 PM, Mario Zito <mazito at analyte.com> wrote:
> > I would like to iterate over all items of a returned ResultSet encoding
> each
> > one using JSON. Example code follows:
> > class Topic(object):
> > __storm_table__= "Trancos.topic"
> > id = Int(primary=True)
> > account_id= Int()
> > title= Unicode()
> > properties= Unicode()
> > notes= Unicode()
> > # and other attrs not important here ...
>
> 8< snip
>
> > rs= store.find(Topic)
> > for t in rs:
> > print t.id, json.dumps(t)
> > But I get the error:
> > File "/usr/lib/python2.6/json/encoder.py", line 344, in default
> > raise TypeError(repr(o) + " is not JSON serializable")
> > TypeError: <__main__.Topic object at 0x26f3090> is not JSON serializable
> >
> > Any ideas ? Is there a way to serialize a Storm object (or a full
> ResultSet)
> > to JSON ?
>
> You need to create a custom encoder for use with simplejson. One
> way forward is to create a custom encoder for each of your Storm
> objects. See the 'Specializing JSON object encoding' section in the
> simplejson documentation for more information [1]. Something like
> this should work (untested):
>
> import simplejson
>
> def encode_topic(topic):
> if isinstance(topic, Topic):
> return {"id": topic.id, "account_id": topic.account_id,
> "title": topic.title, "properties": topic.properties,
> "notes": topic.notes}
> raise TypeError(repr(topic) + " is not JSON serializable")
>
> print simplejson.dumps(topic, default=encode_complex)
>
> This will get tedious if you have many different kinds of objects to
> convert, so you might want to create a generic encoder function that
> will work with any Storm object, for example (also untested):
>
> import simplejson as json
> from storm.info import get_cls_info
>
> def encode_storm_object(object):
> if not hassattr(object, "__storm_table"):
> raise TypeError(repr(object) + " is not JSON serializable")
>
> result = {}
> cls_info = get_cls_info(object.__class__)
> for name in cls_info.attributes.iterkeys():
> result[name] = getattr(object, name)
> return result
>
> storm_object = get_storm_object()
> print simplejson.dumps(storm_object, default=encode_storm_object)
>
> This won't dump non-Storm fields though, which may or may not be a
> problem depending on your needs. Hopefully it's enough to get you
> started doing what you want.
>
> Thanks,
> J.
>
> [1]
> http://simplejson.googlecode.com/svn/tags/simplejson-2.1.1/docs/index.html
>
--
Mario A. Zito
ANALYTE SRL
Parana 457, piso 2, of. 'A'
(C1033AAI) Buenos Aires, Argentina
tel: (54-11) 5258-0205 int 138
mazito at analyte.com
www.analyte.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://lists.ubuntu.com/archives/storm/attachments/20100527/ef033f51/attachment.htm
More information about the storm
mailing list