BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JSON for Modern C++ がバージョン3 .1に

JSON for Modern C++ がバージョン3 .1に

原文(投稿日:2018/02/06)へのリンク

読者の皆様へ: あなたのリクエストに応じて、大切な情報を見逃すことなく、ノイズを減らす機能を開発しました。お気に入りのトピックを選択して、メールとウェブで通知をもらいましょう

JSON for Modern C++ 3.1では、Universal Binary JSON (UBJSON)仕様のサポートとJSON Merge Patchが新たに加わっている。

UBJSONは、JSON for Modern C++がサポートするいくつかのフォーマットのひとつで、エンコードサイズの削減とデコードのスピードアップを目的とする。UBJSONの他には、CBORMessagePackがサポートされている。それぞれが独自の長所を持つため、どれが最適な選択肢であるかは、表現するデータの種類によって異なってくる。3つの中でUBJSONのみが完全なバイナリフォーマットである。すなわち、すべてのJSON値をUBJSONに、すべてのUBJSON値をJSONに変換することが可能だ。

JSON Merge Patchは、2つのJSONドキュメント間の差異を宣言的に記述することを目的としたフォーマットだ。HTTP PATCH動詞と組み合わせて使用するためのものだが、HTTP PUTがリソース全体を置き換えるのに対して、部分的なアップデートを可能にする。JSON Merge Patchを使えば、JSONの一部を定義して、それをサーバ側でマージすることができる。オリジナルのJSONドキュメントに対する一連のパッチ操作仕様に依存する基本的なJSON Patchフォーマットよりも、こちらの方が便利だ。例えば,

// a JSON value
json j_document = R"({
  "a": "b",
  "c": {
    "d": "e",
    "f": "g"
  }
})"_json;

// a JSON patch (RFC 6902)
json j_patch_1 = R"([
  { "op": "replace", "path": "/a", "value": "z" },
  { "op": "remove", "path": "/f"}
])"_json;


// a JSON Merge patch (RFC 7386)
json j_patch_2 = R"({
  "a":"z",
  "c": {
    "f": null
  }
})"_json;

JSON for Modern C++ライブラリは、JSONデータをあたかも通常のデータ型にように扱うことのできる、直感的な構文の提供するためのものだ。例えば次のように記述することで、オブジェクトをインスタンス化することができる。

json j2 = {
  {"pi", 3.141},
  {"happy", true},
  {"name", "Niels"},
  {"nothing", nullptr},
  {"answer", {
    {"everything", 42}
  }},
  {"list", {1, 0, 2}},
  {"object", {
    {"currency", "USD"},
    {"value", 42.99}
  }}
};

同じように、文字列リテラルに__jsonを付け加えれば、JSON文字列のデコードが可能だ。

auto j2 = R"(
  {
    "happy": true,
    "pi": 3.141
  }
)"_json;

その他のメリットとして、全体がひとつのヘッダファイルjson.hppに納められており、外部ライブラリや依存関係をまったく必要としないことによる、高い統合性の提供がある。さらに、ユニットテストによって100パーセントのコードカバレッジを実現するとともに、メモリリークも皆無とされている。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT