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.