BT

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

| 作者: Sergio De Simone フォローする 13 人のフォロワー , 翻訳者 h_yoshida _ フォローする 1 人のフォロワー 投稿日 2018年3月11日. 推定読書時間: 3 分 |

原文(投稿日: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パーセントのコードカバレッジを実現するとともに、メモリリークも皆無とされている。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT