「C++の応用 - JSON」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == <br><br> == JSON for Modern C++ == ==== JSON for Modern C++の概要 ==== 世の中には無数のJSONライブラリがあり、それぞれに存在理由がある。<br> JSON for Modern C++では、次のような設計目標がある。<br> * 直感的な構文 *: Python等のプログラム言語では、JSONはファーストクラスのデータ型のように見える。 *: C++の演算子の全て使用して、コード内で同じ感覚を…」)
 
39行目: 39行目:
<br>
<br>
==== JSON for Modern C++のインストール ====
==== JSON for Modern C++のインストール ====
===== Linux =====
[https://github.com/nlohmann/json JSON for Modern C++のGithub]にアクセスして、ソースコードをダウンロードする。<br>
[https://github.com/nlohmann/json JSON for Modern C++のGithub]にアクセスして、ソースコードをダウンロードする。<br>
ダウンロードするファイルは、Source code (tar.gz)と記載されているリンクである。<br>
ダウンロードするファイルは、Source code (tar.gz)と記載されているリンクである。<br>
53行目: 54行目:
  make install
  make install
<br>
<br>
===== Windows =====
[https://github.com/nlohmann/json JSON for Modern C++のGithub]にアクセスして、ソースコードをダウンロードする。<br>
ダウンロードするファイルは、<u>include.zip</u>または<u>json.hpp</u>と記載されているリンクである。<br>
<br>
ダウンロードしたファイルを解凍する。<br>
各プロジェクトファイルに配置して、json.hppをインクルードして使用する。<br>
<br>
==== 使用方法 ====
==== 使用方法 ====
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">

2023年12月12日 (火) 13:42時点における版

概要



JSON for Modern C++

JSON for Modern C++の概要

世の中には無数のJSONライブラリがあり、それぞれに存在理由がある。
JSON for Modern C++では、次のような設計目標がある。

  • 直感的な構文
    Python等のプログラム言語では、JSONはファーストクラスのデータ型のように見える。
    C++の演算子の全て使用して、コード内で同じ感覚を実現している。

  • 統合の簡素化
    ソースコード全体は、単一のヘッダファイルであるjson.hppファイルで構成されているのみである。
    ライブラリ、サブプロジェクト、依存関係、複雑なビルドシステムは不要である。
    JSON for Modern C++は、C++ 11で記述されており、コンパイラフラグやプロジェクト設定を調整する必要は無い。

  • 高い品質
    JSON for Modern C++は十分にテストされており、全ての例外的な動作を含むソースコードを100%カバーしている。
    また、ValgrindとClang Sanitizersでメモリリークが無いことを確認している。
    さらに、Google OSS-Fuzzは、全てのパーサーに対してファズテストを24時間年中無休で実行し、これまでに数十億のテストを効果的に実行している。
    高品質を維持するために、プロジェクトはコアインフラストラクチャイニシアチブ (CII)のベストプラクティスに従っている。

  • メモリ効率
    各JSON オブジェクトには、1つのポインタ (共用体の最大サイズ)と1つの列挙要素 (1バイト)のオーバーヘッドがある。
    デフォルトの汎化では、次のC++データ型が使用される。
    文字列の場合はstd::string
    数値の場合はint64_t、uint64_t、double
    オブジェクトの場合はstd::map
    配列の場合はstd::vector
    ブール値の場合はbool
    また、必要に応じて汎用クラスのBasic_jsonをテンプレート化することができる。

  • 開発効率
    より高速なJSONライブラリは存在するが、単一ヘッダファイルでJSONサポートを追加することにより、開発を高速化することができる。
    std::vectorクラスやstd::mapクラスの使用方法を知っていれば、すぐに使用することができる。


JSON for Modern C++は、MITライセンスである。

JSON for Modern C++のインストール

Linux

JSON for Modern C++のGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードするファイルは、Source code (tar.gz)と記載されているリンクである。

ダウンロードしたファイルを解凍する。

tar xf json-<バージョン>.tar.xz
cd json-<バージョン>


JSON for Modern C++をビルドおよびインストールする。

mkdir build && cd build

cmake -DCMAKE_INSTALL_PREFIX=<JSON for Modern C++のインストールディレクトリ> ..
make -j $(nproc)
make install


Windows

JSON for Modern C++のGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードするファイルは、include.zipまたはjson.hppと記載されているリンクである。

ダウンロードしたファイルを解凍する。
各プロジェクトファイルに配置して、json.hppをインクルードして使用する。

使用方法

 #include <iostream>
 #include <fstream>
 #include "nlohmann/json.hpp"
 
 int main()
 {
    // JSONファイルの内容
    json m_json = {
                   {"FirstName", "Jung kook"},
                   {"LastName",  "Park"},
                   {"Country",   "Korea"},
                   {"Age",       25},
                   {"Height"     180.5f}
                  };
 
    // JSONファイルの名前
    string filename  = "JSON-Sample";
    string Extension = ".json";
    filename += Extension;
 
    // JSONファイルへ書き込み
    ofstream writing_file;
    writing_file.open(filename, ios::out);  // JSONファイルの作成またはオープン
    writing_file << m_json.dump() << endl;  // JSON型のオブジェクトを書き込むには、シリアライズを行う必要がある
    writing_file.close();                   // JSONファイルを閉じる
 
    // JSONファイルの読み込み
    string filename = "JSON-Sample.json";
    ifstream ifs(filename.c_str());
    if (ifs.good())
    {
       json m_json;
       ifs >> m_json
 
       // 読み込んだデータを各変数へ代入
       string firstname = m_json["FirstName"];
       string lastname  = m_json["LastName"];
       int    age       = m_json["Age"];
       double height    = m_json["Height"];
 
       // 各データの表示
       cout << "firstname:" << firstname << endl;
       cout << "lastname:" << lastname << endl;
       cout << "age:" << age << endl;
       cout << "height:" << height << endl;
    }
    else
    {  // JSONファイルの読み込みに失敗した場合
       cout << "ファイルの読み込みに失敗しました" << endl;
    }
 
    return 0;
 }