「C++の応用 - JSON」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == <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;
}