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

Reply via email to