JSON


JavaScript Object Notation

JSON について

JSON for Modern C++ - Niels Lohmannnlohmann-json ライブラリを利用しています。

JSON

Modern C++ は C++11 以降の近代化された C++ 言語のこと。C 言語を拡張した派生言語として進化した C++ でしたが、時代に合わせ更なる進化を求めた結果 Modern C++ として生まれ変わりました。Modern 以前と以後でプログラムの書き方が異なり、3 年ごとに新規格が生まれ C++11、C++14、C++17、C++20、C++23 とこれら全てが Modern C++ です。

Modern C++ で書かれた JSON ライブラリの中でも人気が高い nlohmann/json です。近年の流行でもあるヘッダーオンリーなオープンソースライブラリ、多機能だが安定性と実績があり実際使ってみれば大変便利。処理速度が遅いことについては常に言及されてますが、利便性が勝ります。


データフォーマット

JSON はファイルの場合 UTF-8 形式で保存されたテキストデータですが、特定のデータ記述形式に沿って内容が書かれています。

JSON の登場以前にもデータ交換用のデータフォーマットとしては CSV や XML がありました。 CSV は仕様が曖昧で統一規格が無くデータの可読性も悪い、XML はマークアップ言語を駆使した記述は統一的で自由度も高い、けれどデータをタグで括る方式は構文解釈に時間がかかりデータ量も多くなるなどの欠点があります。

JSON はまず可読性が高い、無駄な情報が少なく XML よりデータ量も小さくなる。扱えるデータ型も CSV より多く、文字列、数値、真偽値、null に加えてデータ構造型も配列とオブジェクトが扱えます。


比較

Animals Sounds Legs
Cat Meow 4
Dog Woof 4
Owl hoo-h’HOO-hoo-hoo 2

上記テーブルを CSV、XML、JSON でそれぞれ記述してみます。

FORMAT
Animals,Sounds,Legs
Cat,Meow,4
Dog,Woof,4
Owl,hoo-h'HOO-hoo-hoo,2
<?xml version="1.0" encoding="utf-8"?>
<Animals>
    <Animal Type="Cat" Sounds="Meow" Legs="4" />
    <Animal Type="Dog" Sounds="Woof" Legs="4" />
    <Animal Type="Owl" Sounds="hoo-h'HOO-hoo-hoo" Legs="2" />
</Animals>

{
    "ANIMALS":["Cat", "Dog", "Owl"],
    "SOUNDS":["Meow","Woof","hoo-h’HOO-hoo-hoo"],
    "LEGS":  [4,4,2]
}

小さなデータの場合 CSV でも足りるけど、JSON は CSV では表現できなかったデータ構造型も記述できます。

XML はデータの各エンティティを個別のタグで明確に区別することが重要で、XML の記述の冗長性にはデータの一貫性と可読性を高める目的があるために省くことはできず、結果的にデータ量が増えていきます。

「動物」「音」「足の本数」というキーワードに対して、3 つのデータセットが配列に含まれています:

  • 動物 = 猫,犬,梟
  • 鳴き声 = ナー,ウー,ホーぅホホぅホーホー(迫真)
  • 足の数4, 4, 2

これを辞書型のデータ構造にパースして C++ で利用できるようにするのが nlohmann/json ライブラリの役割です。


関連