連載 [第6回] :
PerlでWeb APIを使いたおすJSONとYAML
2006年10月16日(月)
データの生成、解析
さて、JSONも非常にシンプルなデータ形式なので、XMLと同様直接解析することもできますが、JSONもしくはJSON::Syckを利用すると簡単に生成や解析ができます。今回はJSON::Syckを利用します。こちらはPerlのデータとJSONデータの相互変換のみをサポートするモジュールです。
リスト25にGeonamesのJSONデータを読み込んで緯度と経度を表示するプログラムを示します。
リスト25:Geonamesにアクセスするプログラム
#!/usr/bin/perl
use strict;
use warnings;
use JSON::Syck;
use LWP::UserAgent;
my $entrypoint = 'http://ws.geonames.org/searchJSON';
my $place = 'tokyo';
my $rows = 3;
my $request = $entrypoint.'?q='.$place.'&maxRows='.$rows;
my $ua = LWP::UserAgent->new;
$ua->timeout(5);
my $response = $ua->get($request);
my $json = $response->content if $response->is_success;
my $data = JSON::Syck::Load($json);
foreach (@{$data->{geonames}}){
print $_->{lat}.','.$_->{lng}."\n";
}
同様に、サーバー側の実装を考えて見ましょう。こちらもJSON::Syckを使ってPerlのオブジェクトをJSONに変換するだけなので簡単です。
リスト23で作成した足し算を行うAPIをJSONに対応させてみましょう(リスト26)。変更するのは出力の部分だけです。こちらの出力するJSONも単純なのですが、ここではあえてJSON::Syckを利用しています。
リスト26:計算を行うAPIプログラムJSON版
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $cgi = CGI->new;
my $num1 = $cgi->param('num1');
my $num2 = $cgi->param('num2');
my $result = $num1 + $num2;
my $result = { sum => $num1 + $num2 };
my $json = JSON::Syck::Dump($result);
print "Content-type: text/plain\n\n$json";
返ってくるデータは以下のようになります。
{"sum":30}
ちなみに、最初にJSONとともに紹介したYAMLは、YAML Ain't Markup Languageの略です。これもまた構造化データを表現するためのフォーマットで、人間にも読みやすい表記法に特徴があります。以下にサンプルを示します。
---
name: hogehoge
age: 30
cdata:
- 24
- 11
- 13
PerlではJSON/JSON::Syckと同じように、YAML/YAML::Syckというモジュールもあり、こちらを利用してYAMLデータの生成、解析ができます。リスト26の「JSON」をそのまま「YAML」に置き換えれば、YAMLでの出力ができます。
まとめ
ここではよく利用されるWeb APIの使い方について紹介してきました。Web APIは、基本的にはHTTPでのアクセスとやり取りをするデータの形式さえわかれば利用できます。
Web上で展開するサービスが、その機能の一部をWeb APIとして公開するケースは非常に増えてきています。これは、プログラマ向けに自分たちの持つデータやシステムを積極的に公開することで、自分たちが直接開発を行わなくても、より多くの人がその情報を活用してくれること、そしてそれによって情報がより多く集まることや新しい可能性を見つけ出してくれること、そのサービス自体の知名度が向上することなどを期待しているからです。
皆さんもこの仕組みをぜひ活用してみてください。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。