# 使われ方色々!?メジャーなデータフォーマットを解説します!
こんにちは!あさもっちゃんです!
自分の住んでる環境とは違う場所から来た人の言葉、よくわからなかったりしませんか? 日本国内でさえ、方言のせいで意思疎通がうまくできなかったりします。
システムも同じで、システム間のやり取りをする際に、 お互いがわかる情報の形式になっていないと正常に値のやり取りをする事ができないのです。 そのため、各システム共通で利用できるデータフォーマットが策定されています。
今回はそのデータフォーマットについて、メジャーなものを取り上げて説明したいと思います!!!
CSV (Character Separaterd Value)
データフォーマットとしてはもっともシンプル。それがCSVです。 中身はと言いますと、読んで字のごとく、「文字で分離された値」の構造となっています。
サンプルは下記になります。
ひろくん,28,男性,東京都千代田区千代田1−1,01-2345-6789 ゆきちゃん,31,女性,東京都千代田区千代田1−1,11-2358-1321 まーくん,3,男性,東京都千代田区千代田1−1,01-4916-2536
情報の記述の順序は名前,年齢,性別,住所,電話番号となっていますね。 このフォーマットの良い所はわかりやすい二次元構造となっている点です。 分割としてもよくあるコンマ区切りでわかりやすいし、一行が一つのまとまりとなっている点もわかりやすいですね。 また結果的に、他構造と比べてシンプルであるため、この形式に変換するとバイト数が非常に少なくなります。
逆に悪い点は、カラム構造をあらかじめ理解してないといけない事が挙げられます。 システムからしたら、コンマ区切りの何番目に住所があるのかがあらかじめ決まっている必要があるという事です。 また、フォーマットの特性上、2次元以上の構造を表現できないです。 例えば今回の図ならひろくんの友達リストというものをそのまま追加する事ができませんね。
使い所としては、
- 一つのまとまりが1次元で表現できる値を大量にやり取りする時
- Excel等、二次元で表現される情報をやり取りする時
となります。
ちなみに、コンマではなくタブ文字で区切る場合もあります。こちらもCSVと呼ばれます。 Excelで表を範囲指定してコピーすると、内部的にはタブ文字区切りなのは有名ですね。
また、1文節内でコンマを使いたい場合は、文節の最初と最後を「"」で囲む事で使用可能になります。
XML (eXtensible Markup Language)
よく使われるフォーマットとしては最もカッチリしたフォーマットです。 先ほどのCSVで作ったサンプルをXMLで表現してみます。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE persons SYSTEM "persons.dtd"> <persons> <person> <name>ひろくん</name> <age>28</age> <gender>男性</gender> <address>東京都千代田区千代田1−1</address> <phone>01-2345-6789</phone> </person> <person> <name>ゆきちゃん</name> <age>31</age> <gender>女性</gender> <address>東京都千代田区千代田1−1</address> <phone>11-2358-1321</phone> </person> <person> <name>まーくん</name> <age>3</age> <gender>男性</gender> <address>東京都千代田区千代田1−1</address> <phone>01-4916-2536</phone> </person> </persons>
どの値が何の意味を持つのか、わかりやすくなりましたね。 書き方は非常にHTMLと似通っています。
このフォーマットの良いところは、妥当性チェックを行えるところです。 XMLでは、上記のような本文とは別に、フォーマットの具体的な形式を定義する 「DTD(Document Type Defnition)」というものを記述する事で、内容の妥当性チェックを行う事ができます。
また、入れ子構造になっているので、多次元の値にも対応しているところが素晴らしいですね。 これなら、CSVの場合には表現できなかった友達リストを入れこむ事ができます。
さらに、要素に属性値を持たせる事も出来るので、かなり自由度の高いデータフォーマットとなっています。
しかしながら、CSVと比べて非常に読みづらいですよね。見ててとても疲れてきます。 要素名が要素の最初と最後に書かれているような構造になっているため、どうしても冗長に感じてしまうのです。
また、属性のvalueを直接nullにする事ができないため、属性値でnullであることを記述する必要があります。
使い所としては、
- 妥当性チェックが必要な場面
- 複雑かつ柔軟なデータ構造を表現する場面
となります。
Javaを使って開発をする際は、
などに使用されています。
ちなみに、要素の中身以外での改行やスペース、タブ文字はフォーマットに影響がないので、好きな形にする事ができます。
JSON (JavaScript Object Notation)
Web系でよく使われる、今一番イケてるフォーマットです。 同じく、person情報をサンプルに記述して見ます。
{ "persons": { "person": [ { "name": "ひろくん", "age": 28, "gender": "男性", "address": "東京都千代田区千代田1−1", "phone": "01-2345-6789" }, { "name": "ゆきちゃん", "age": 31, "gender": "女性", "address": "東京都千代田区千代田1−1", "phone": "11-2358-1321" }, { "name": "まーくん", "age": 3, "gender": "男性", "address": "東京都千代田区千代田1−1", "phone": "01-4916-2536" } ] } }
XMLと比べて、ぱっと見だいぶスッキリしましたよね。
JavaScript内でデータを記述するために生まれた形式で、JavaScript内でのサポートが強いです。
XMLと同じく、要素名と値というkey:valueの関係で表現され、入れ子構造にも対応しています。
値の型についても、ダブルクォート「"」で囲まれていれば文字列、そうでなければ各種型として扱われます。 よって、ある程度の型制約もかける事が可能となります。
しかし問題点としては、他のフォーマットと比べて括弧のオンパレードとなってしまいます。 そのため、タブや改行を使ってうまく記述しないと多少読みづらさを感じます。
使い道としては、
- JavaScriptのデータ記述
- HTTP通信のRequestBody
- JavaScirpt関係のシステムの設定ファイル(npmのpackage.jsonなど)
になります。
YAML (YAML Ain't a Markup Language)
データフォーマットの中で一番読みやすいと思われるのがこのYAMLです! サンプルは下記になります。
persons: person: - name: "ひろくん" age: 28 gender: "男性" address: "東京都千代田区千代田1−1" phone: "01-2345-6789" - name: "ゆきちゃん" age: 31 gender: "女性" address: "東京都千代田区千代田1−1" phone: "11-2358-1321" - name: "まーくん" age: 3 gender: "男性" address: "東京都千代田区千代田1−1" phone: "01-4916-2536"
この形式は、各種フレームワークやアプリケーションの設定ファイルとして使われる事が多いです。 記述方法は少々特殊なものになりますが、覚えたら一番シンプルかつわかりやすく書く事ができます。
また、記述ルールが多様なため、JSON形式の文字列をYAML形式として読み取ることも可能です。
使い道としては、
- 設定ファイル記述
となります。
かの有名な仮想コンテナのDockerのdocker-pomposeの設定、 Ruby on Railsの設定、Spring Bootの設定などに使用されています。
まとめ
というわけで、メジャーなデータフォーマットについて説明させて頂きましたが、いかがでしたでしょうか。
今回説明した内容の特徴をまとめると下記になります。
特徴 | CSV | XML | JSON | YAML |
---|---|---|---|---|
文字数が少ない | ◯ | × | △ | △ |
妥当性チェックができる | × | ◯ | × | × |
大量のデータを扱いやすい | ◯ | × | ◯ | △ |
多次元構造を表現できる | × | ◯ | ◯ | ◯ |
記述ルールが簡単 | ◯ | × | ◯ | △ |
人間が読みやすい | × | × | △ | ◯ |
それぞれ特化した特徴があり、使い所が分かれています。 それぞれの特徴を生かし、より良い選択ができると良いなと思います。
他にも、TOML, ini, HOCONなどの形式もあります。 全てを覚える必要はありませんが、使いこなせるとより良いと思います!!
今回はそれぞれの概要のみでしたが、値を取り扱うためのライブラリを用いて詳しく説明する記事を、別の機会に書きたいと思います。
ここまで読んで頂き、ありがとうございました!!!