多くのウェブサービスで提供されるJSONデータは改行もインデントもなく読みづらい。PipesとかPipesとかPipesとか。Big SkyではGUIツールを作っていたけど、単にデータの構造を把握したいだけとかならXMLに変換してブラウザで見るのでも良いと思う。今まではその変換を適当なPerlスクリプトでやってたが、JavaScriptだけで出来そうな気がしたのでとりあえず作ってみた。そこそこ使えそう。
コアになるコードは20行ほどの再帰的に呼ばれる関数だけ。
function JSONtoXML (obj, depth) {
var result = "", indent = "";
for (var i = 0; i < depth; i++) {
indent += " ";
}
for (var key in obj) {
var name = key;
if (key.match(/^\d+$/)) name = "item";
if (typeof(obj[key]) == "object") {
result += indent + "<" + name + ">\n";
depth++;
result += JSONtoXML(obj[key], depth);
depth--;
result += indent + "</" + name + ">\n";
} else {
result += indent + "<" + name + ">" + encodeEntities(obj[key]) + "</" + name + ">\n";
}
}
return result;
}
結果をインデントしないならもっと短くなる(インデントは趣味)。JSONデータ内に配列がある場合はitem
という要素にして並べるので、item
という文字列のキーを持つJSONとかではきっとややこしいことになる(arrayとかに変えたほうが良さそうだ)。上記URLのではこの返り値をダミーのroot
という要素でくくって、XML宣言を付け出力を作っている。ダミーの要素を追加する理由は、いきなり配列で始まるJSONデータでおかしなことになることへの対策。
あとは"data" URLスキームを使ってリンクを生成するだけでOK。"data" URLスキームを利用するアイディアはJavaScriptでテキストファイルを生成してダウンロードさせるから。今まで積極的に使ったことがなかった"data" URLスキームだけど、こんな感じでXMLに限らずHTMLとかの表示もいけるんだなーと思ったら、ブログツールのエントリやコメントの投稿プレビューとかに使えるんじゃないかとか妄想した。リンククリックさせるのは手間かかるからiframe
作ってそこにプレビューみたいな。
なお、はてなブックマークエントリー情報取得APIの返すJSONのようにeval()
できるように括弧でくくられてるものとかは変換できない。
JSON2XMLのURLのハッシュにJSONデータのURLを渡してやると変換を即実行できたりも。あまり使いどころないけど。
逆(XML2JSON)はYQLを使うのが良い。