読者の皆様へ: あなたのリクエストに応じて、大切な情報を見逃すことなく、ノイズを減らす機能を開発しました。お気に入りのトピックを選択して、メールとウェブで通知をもらいましょう。
JSON for Modern C++ 3.1では、Universal Binary JSON (UBJSON)仕様のサポートとJSON Merge Patchが新たに加わっている。
UBJSONは、JSON for Modern C++がサポートするいくつかのフォーマットのひとつで、エンコードサイズの削減とデコードのスピードアップを目的とする。UBJSONの他には、CBORやMessagePackがサポートされている。それぞれが独自の長所を持つため、どれが最適な選択肢であるかは、表現するデータの種類によって異なってくる。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パーセントのコードカバレッジを実現するとともに、メモリリークも皆無とされている。
この記事を評価
- 編集者評
- 編集長アクション