JavaScript Object Notation
REST 指向の Web API に有用とされている。YAML よりもライブラリが整備されているという話も。
どのくらい簡単に扱えるものか試してみた。
情報源
<html> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=r4wh-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4774142042" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </html>
サーバ側は ruby_on_rails 2.3.5 のアプリケーション。scaffold で作った items_controller.rb に render :json を追加。
class ItemsController < ApplicationController # GET /items # GET /items.xml # GET /items.json def index @items = Item.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @items } format.json { render :json => @items } end end
ついでに Basic 認証を試す。
class ApplicationController < ActionController::Base helper :all # include all helpers, all the time protect_from_forgery # See ActionController::RequestForgeryProtection for details before_filter :basic_authentication protected def basic_authentication authenticate_or_request_with_http_basic do |user, pass| [user, pass] == ['user', 'pass'] end end end
クライアント側は Python 2.6 で記述。
import urllib2 import json toplevelurl='example.com' theurl='example.com/items.json' protocol='http://' username='user' password='pass' passman = urllib2.HTTPPasswordMgrWithDefaultRealm() passman.add_password(None, toplevelurl, username, password) authhandler = urllib2.HTTPBasicAuthHandler(passman) opener = urllib2.build_opener(authhandler) urllib2.install_opener(opener) pagehandle = urllib2.urlopen(protocol + theurl) print pagehandle.geturl() print print pagehandle.info() print # print pagehandle.read() items = json.load(pagehandle) for i in items: print "%s %s" % (i['item']['id'], i['item']['name'])
実行結果。サーバは heroku で動いている。URLは修正してある。
http://example.com/items.json Server: nginx/0.6.39 Date: Sat, 01 May 2010 12:39:46 GMT Content-Type: application/json; charset=utf-8 Connection: close X-Runtime: 2 ETag: "326b8c484caf73132e54cf1d67adc5f3" Cache-Control: private, max-age=0, must-revalidate Content-Length: 213 X-Varnish: 856212766 Age: 0 Via: 1.1 varnish 1 hogehoge 2 fuga