Sinatra::JSON adds a helper method, called json,
for (obviously) json generation.
In a classic application simply require the helper, and start using it:
require "sinatra" require "sinatra/json" # define a route that uses the helper get '/' do json :foo => 'bar' end # The rest of your classic application code goes here...
In a modular application you need to require the helper, and then tell the application you will use it:
require "sinatra/base" require "sinatra/json" class MyApp < Sinatra::Base helpers Sinatra::JSON # define a route that uses the helper get '/' do json :foo => 'bar' end # The rest of your modular application code goes here... end
Per default it will try to call to_json on the object, but if
it doesn't respond to that message, will use its own, rather simple
encoder. You can easily change that anyways. To use JSON,
simply require it:
require 'json'
The same goes for Yajl::Encoder:
require 'yajl'
For other encoders, besides requiring them, you need to define the
:json_encoder setting. For instance, for the
Whatever encoder:
require 'whatever' set :json_encoder, Whatever
To force json to simply call to_json on the
object:
set :json_encoder, :to_json
Actually, it can call any method:
set :json_encoder, :my_fancy_json_method
It will automatically set the content type to "application/json". As
usual, you can easily change that, with the :json_content_type
setting:
set :json_content_type, :js
The json helper will also take two options
:encoder and :content_type. The values of this
options are the same as the :json_encoder and
:json_content_type settings, respectively. You can also pass
those to the json method:
get '/' do json({:foo => 'bar'}, :encoder => :to_json, :content_type => :js) end
# File lib/sinatra/json.rb, line 92 def encode(object) enc object, Array, Hash end
# File lib/sinatra/json.rb, line 114 def json(object, options = {}) encoder = options[:encoder] || settings.json_encoder content_type options[:content_type] || settings.json_content_type if encoder.respond_to? :encode then encoder.encode(object) elsif encoder.respond_to? :generate then encoder.generate(object) elsif encoder.is_a? Symbol then object.__send__(encoder) else fail "#{encoder} does not respond to #generate nor #encode" end end