読者です 読者をやめる 読者になる 読者になる

JSONで遊びたい

Perl JavaScript

JSONをいじってみようと思っていたのだが、うまい具合にデータを出してくれているところが少ない。(del.icio.usくらい?)そんなわけで、RSSをJSONに加工して、それで遊んでみることにした。

#!/usr/bin/perl
use strict;
use CGI::Carp qw(fatalsToBrowser);
use LWP::Simple;
use XML::RSS;
use JSON;

binmode STDOUT,':utf8';

my $uri;
if( -t ){
	$uri = shift @ARGV;
}
else{
	( $uri = $ENV{'PATH_INFO'} ) =~ s|^/||;
	print "Content-Type: text/javascript; charset=utf-8?n?n";
}

my $rss = XML::RSS->new;
$rss->parse( get( $uri ) );

my $struct = {
	title	=> $rss->{channel}->{title},
	link	=> $rss->{channel}->{link},
	author	=> {
		name => $rss->{channel}->{dc}->{creater}
	},
	entries	=> []
};

@{$struct->{entries}} = map {
	$_ = {
		title	=> $_->{title},
		link	=> $_->{link},
		date	=> $_->{dc}->{date}
		}
	} @{$rss->{items}};

print "jsonfeed = ".JSON->new->objToJson( $struct );
exit;

http://aql.osx.cc/rss2json/http://d.hatena.ne.jp/aql/rss

http://aql.osx.cc/rss2json/以下に変換したいRSSURIを指定してやれば良い。いろいろ手抜きだが、とりあえず実験ってことなので。出力はJSON Feedを真似たが諸事情により正確に一致していない。

  • jsonfeeds[uri]になっていない
    • 私のやり方のせいかもしれないが、ぱっと出してみたときにSafariで読めなかった
  • timeをRFC822に変換していない
    • 実験だから省略(ぉ

まぁ、ともかく。これで一応出るわけだ。ただ、ここまで来てはたと悩んでいる。結局JSON Feedっていうのは、XMLで既に出来ることをやっているわけで、それ以上の何かが出来るわけでは無さそうなのだ。

確かに、XMLHttpRequestなんかを使わずに、さっくり他のフィードをウェブページ上に埋め込めたりする。

<div id="container"><h2>JSON Feed</h2></div>
<script
    type="text/javascript"
    src="http://aql.osx.cc/rss2json/http://d.hatena.ne.jp/aql/rss"
></script>
<script type="text/javascript"><!--
var ul = document.createElement('ul');
for ( var i = 0, entry; entry = jsonfeed.entries[i]; i++ ){
	var li = document.createElement('li');
	var a = document.createElement('a');
	a.setAttribute('href', entry.link);
	a.appendChild(document.createTextNode(entry.title));
	li.appendChild(a);
	ul.appendChild(li);
}
document.getElementById('container').appendChild(ul);
//--></script>

確かにラクチン。だが、XMLだとDOMをいじくり回したりと面倒は面倒だが、出来ないことでも無いわけで。Ajaxで使うのも同じこと。そうすると、ラクチン以外のJSONの利点って何だろう、とか考えてしまう。

JSONだと関数をそっくり渡せるので、その辺をうまく使ったりするのかな…うーん?

あ、でもラクチンはとても大事だと思う。