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.
>>
>>
>>