XMLとJSONの話(1) データフォーマットとしての比較

Posted by Hiraku on 2012-10-02

XMLとJSONの相互変換を行うライブラリはいくつかありますが、完璧なものはどこにもありません。そもそもフォーマットに互換性がないからです。

XML_Builderを作る中でXMLとJSONを比較したのですが、一旦まとめておこうと思います。

XML

XMLは文書の電子化に源流があります。そのため長いテキストをベースに何か情報を付加していくのには非常に便利なフォーマットです。反面、含めることができるのはテキストのみで、integerやboolean、nullといった基本的な型は存在しませんし、バイナリデータを含めることもできません。(BASE64でエンコードするなどの工夫が必要です)

例えば、以下のような文章があった時、

PHPはPHP: Hypertext Preprocessorの略で、プログラミング言語の一種である。

リンクを張るなど、文章の一部にメタ情報を付与し、

<dfn id="php"><a href="http://jp.php.net/">PHP</a>とはPHP: Hypertext Preprocessorの略</dfn>で、プログラミング言語の一種である。

これをルート要素で囲めば妥当なXMLが出来上がります。

<?xml version="1.0" encoding="UTF-8"?>
<p><dfn id="php"><a href="http://jp.php.net/">PHP</a>とはPHP: Hypertext Preprocessorの略</dfn>で、プログラミング言語の一種である。</p>

作っていく流れが自然ですよね。こんな風に、テキスト中の任意の位置にタグを追加できるというのがXMLの大きな特徴です。テキストとタグが入り混じっている部分はmixed contentと呼ばれます。

このmixed contentは他のフォーマットでうまく真似できないものです。XMLをJSONで表現したJSONMLというフォーマットがありますが、これで上記のXMLを真似するとこんな風になります。

["p",["dfn",{"id":"php"},["a",{"href":"http://jp.php.net/"},"PHP"],"とはPHP: Hypertext Preprocessorの略"],"で、プログラミング言語の一種である。"]

健闘はしているんですが、XMLよりも長くなってしまいました。それに、閉じタグが常に"]"なので対応が追い辛いと思います。XMLの閉じタグの仕様は冗長なのですが、人間の目で読むときは読みやすくなります。

また、JSONMLにしてしまうと、(専用ライブラリの補助なしでは)非常に扱い辛いJSONになります。このJSONMLから「http://jp.php.net/」の部分を取り出す場合、「[1][2][1].href」というわけのわからない添え字を書かないといけません。XPathを使えば「//@href[1]」で済むので圧倒的にわかりやすいです。

その他の特徴

  • コメント構文がある
  • 名前空間
  • 周辺実装が充実(XPath, スキーマ言語などなど)

JSON

JSONはJavaScriptのオブジェクト表記法から来ています。そのため何らかのデータ構造体を表す場合は短く表記することができます。当然、テキスト以外にintegerやboolean, nullのような基本型が仕様に含まれており、テキストはバイナリを含めることもできます。

型がしっかり決まっているというのはとても有難いことで、このおかげで「空の値」をそれぞれ区別することができます。null、空文字、空配列、空オブジェクトの区別があるわけです。

{
  "a":null,
  "b":"",
  "c":[],
  "d":{}
}

この点、XMLはテキストのことしか考えていないので、こういう芸当はできません。

<!-- ... -->
<a/>
<b/>
<c/>
<d/>
<!-- ... -->

区別がつかなくなってしまいました。XMLで型を表したい場合はXMLSchemaやRELAX NGなど、XML文書とは別にスキーマ定義文書が必要になります。

まとめ

XMLもJSONも得意不得意があるので使い分けすればいいと思うよ!

もう少し言うと、XHTMLなどのXML由来のものを混ぜたければXMLで書いて、そうでなければとりあえずJSONにしとけばたぶん後悔しないと思います。

keyword: xml JSON

architectureの最新記事

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。