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