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