Hmm, I don't think you're supposed to have to call as_dict if you're already using generic.json -- it should be called automatically by the JSON serializer. Maybe report an issue on Google code.
Anthony On Monday, May 28, 2012 4:03:26 PM UTC-4, G. Clifford Williams wrote: > > yes. I've set: > response.view = 'generic.json' > > applications/welcome/views/generic.json (for me) contains only: > {{from gluon.serializers import json}}{{=XML(json(response._vars))}} > > Thanks for reminding me of as_dict(), it never even occurred to me to use > it here. > > On Monday, May 28, 2012 2:47:09 PM UTC-5, Anthony wrote: >> >> You can do: >> >> return dict(person = db.person(id).as_dict()) >> >> See http://web2py.com/books/default/chapter/29/6#as_dict-and-as_list. >> >> Are you using the generic.json view? If so, it passes the returned value >> to gluon.serializers.json, which should automatically call the as_dict() >> method of the Row object. Alternatively, you could import >> gluon.serializers.json and use it directly. >> >> Anthony >> >> On Monday, May 28, 2012 2:05:57 PM UTC-4, G. Clifford Williams wrote: >>> >>> I was migrating some of the ReST APIs that I'd hand-rolled over to the >>> new(?) ReST facilities in web2py and noticed while going through the >>> examples ( >>> http://web2py.com/books/default/chapter/29/10#Restful-Web-Services) >>> that JSON serialization kept failing. I'm using 1.99.7. >>> >>> It looks like the problem is all of the functions (lambda and methods) >>> attached to each dal object passed to the view: >>> >>> TRACEBACK >>> >>> 1. >>> 2. >>> 3. >>> 4. >>> 5. >>> 6. >>> 7. >>> 8. >>> 9. >>> 10. >>> 11. >>> 12. >>> 13. >>> 14. >>> 15. >>> 16. >>> >>> Traceback (most recent call last): >>> File "/Users/prog/web2py/generic/gluon/restricted.py", line 205, in >>> restricted >>> exec ccode in environment >>> File >>> "/Users/prog/web2py/generic/applications/resttest/views/generic.json", line >>> 2, in <module> >>> File "/Users/prog/web2py/generic/gluon/serializers.py", line 61, in json >>> return json_parser.dumps(value,default=default) >>> File >>> "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", >>> line 238, in dumps >>> **kw).encode(obj) >>> File >>> "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", >>> line 201, in encode >>> chunks = self.iterencode(o, _one_shot=True) >>> File >>> "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", >>> line 264, in iterencode >>> return _iterencode(o, 0) >>> File "/Users/prog/web2py/generic/gluon/serializers.py", line 37, in >>> custom_json >>> raise TypeError(repr(o) + " is not JSON serializable") >>> TypeError: <function <lambda> at 0x100e70500> is not JSON serializable >>> >>> I first wrote a filter to weed out functions which was useful in getting >>> the examples to work but was much more involved than required to solve my >>> use case. In the end I went with a list comprehension containing only the >>> fields that I needed. Instead of: >>> >>> return dict(person = db.person(id)) >>> >>> I used something like: >>> return dict([(field,db.person(id)[field]) for field in ['name', 'id', >>> 'info']]) >>> >>> >>> Has anyone ever gotten the examples working without using such tricks? >>> it took a while for me to get from 1.95.x up to 1.99.x so I don't know >>> whether my experience is unique or due to a code change. >>> >>> Thanks. >>> >>> >>>