JSON Serialization¶
Pecan includes a simple, easy-to-use system for generating and serving
JSON. To get started, create a file in your project called
json.py
and import it in your project’s app.py
.
Your json
module will contain a series of rules for generating
JSON from objects you return in your controller.
Let’s say that we have a controller in our Pecan application which
we want to use to return JSON output for a User
object:
from myproject.lib import get_current_user
class UsersController(object):
@expose('json')
def current_user(self):
'''
return an instance of myproject.model.User which represents
the current authenticated user
'''
return get_current_user()
In order for this controller to function, Pecan will need to know how to
convert the User
object into data types compatible with JSON. One
way to tell Pecan how to convert an object into JSON is to define a
rule in your json.py
:
from pecan.jsonify import jsonify
from myproject import model
@jsonify.register(model.User)
def jsonify_user(user):
return dict(
name = user.name,
email = user.email,
birthday = user.birthday.isoformat()
)
In this example, when an instance of the model.User
class is
returned from a controller which is configured to return JSON, the
jsonify_user()
rule will be called to convert the object to
JSON-compatible data. Note that the rule does not generate a JSON
string, but rather generates a Python dictionary which contains only
JSON friendly data types.
Alternatively, the rule can be specified on the object itself, by
specifying a __json__()
method in the class:
class User(object):
def __init__(self, name, email, birthday):
self.name = name
self.email = email
self.birthday = birthday
def __json__(self):
return dict(
name = self.name,
email = self.email,
birthday = self.birthday.isoformat()
)
The benefit of using a json.py
module is having all of your JSON
rules defined in a central location, but some projects prefer the
simplicity of keeping the JSON rules attached directly to their
model objects.