JavaScriptでJSON2XML

多くのウェブサービスで提供される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を使うのが良い。