このエントリーはポエムです。
msgpackにschemaがないと使いものにならないとい言う人がjsonについてどのような意見をお持ちなのか聞きたい
— tagomoris (@tagomoris) July 27, 2015
JSONはプレーンテキストで読み書きできて、RFCで標準化されてて、多くの処理系で標準サポートされているというのは強みですね。特に、E4Xが死に絶えた今、ブラウザという環境がネイティブで対応しているのがJSONしかない、という意味でもJSONはオンリーワン。後付ではあるものの(とはいえ、XML Schemaですら後付けなので後付けがデメリットではない)、色々な言語環境にポートされているJSONスキーマもあるので、固くしようと思えばできる。といってもウェブのAPIの出入口ぐらいでしか書こうというモチベーションはわかないし、それであまり困ったこともない。
JSONと比べると、一部すぐれたフォーマットはいろいろあります。
MessagePackは速い。でも小さいかというと、lz4で上から圧縮するとJSONとサイズがほとんど変わらない。しかもプレーンテキストでなくてスキーマもないという点で、リポジトリに入れたり、長期間保存するデータには向かないかなぁと思っています。ストリームフォーマットで使ったり、ストレージに一時的にキャッシュする用途ぐらい。goの処理系がうまくできている( https://github.com/ugorji/go )ので、JSONである程度実装していて特別に速度が欲しいときに移行するというのは便利。RPCは使ったことないです。
YAMLはJSONと比べると少しはリポジトリ上のマージがしやすいというのはあるけど、まあ一部ですね。標準化されてなくて、処理系によってどこまでサポートされているのか分からんというのと、マップ、配列の書き方が2種類あって云々というのはマイナス。というかパーサ書くのツライ。1ラインで書ける表記を封印して、インデント固定、JSONと100%相互変換なYAML--な感じで、スキーマ、エディタ拡張、Chrome拡張でカラーリングみたいなツールがそろっているようなやつ、誰か作って。
iniは安定のフォーマットですね。シリアライズ用途ではなく、手でコンピュータにデータをインプットするにはまだまだ使えます。Pythonとか標準でサポートしてますしね。コメントも書けるし、ブロックも持てるので可読性高いです。まあストリームで使うとか、シリアライズで使うことはないですね。
Protocol Buffersはバイナリではあるものの、スキーマがあってさまざまな言語のパーサがあって、HTTP/2でRPCできるgRPCができた今、保存用以外の用途はすべてこれにしたいランクno.1ですね。周辺ツールサポートが強い。gRPCがnode.jsだけじゃなくて、ブラウザのクライアントも出力できたら完璧だったのに!
ということで、僕の中の順位としては
- JSON(オールマイティ)
- Protocol Buffers(保存用途以外は今後はこれにしたい)
- ini(設定ファイル用途では無難)
- MessagePack(JSONの用途のごく一部で速度が欲しい時)
- YAML(Unityで仕方なく)
Thriftはあまり使ったことないので省略。
あ、型情報持てる/スキーマがある/クエリーが得意という意味では、意外とSQLiteがシリアライズフォーマットとしては強いのかも、と思ったり。参照用途が多い場合は・・・ですが。