JSON は、読み書きが簡単で、機械による解析と生成が簡単な軽量のデータ交換形式です。 JSON 形式を使用すると、さまざまなシステム間でのデータ転送が簡単になります。 C には、JSON 処理用のオープンソース JSON ライブラリが多数あります。この記事では、一般的に使用される JSON 処理メソッドと C での実装をいくつか紹介します。
C での JSON 処理メソッド
RapidJSON は、DOM、SAX、およびインメモリ プール スタイル API を提供する高速 C JSON パーサー/ジェネレーターです。その主な機能は次のとおりです:
RapidJSON では、JSON オブジェクトは DOM および SAX を通じて解析でき、DOM メソッドは Value クラスを通じて実装できます。以下は、RapidJSON を使用して JSON を生成および解析するサンプル コードです。
#include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include <iostream> using namespace rapidjson; using namespace std; int main() { // 生成JSON StringBuffer s; Writer<StringBuffer> writer(s); writer.StartObject(); writer.Key("name"); writer.String("Tom"); writer.Key("age"); writer.Int(20); writer.EndObject(); // 解析JSON Document d; d.Parse(s.GetString()); cout << "name: " << d["name"].GetString() << endl; cout << "age: " << d["age"].GetInt() << endl; return 0; }
Boost.PropertyTree は、シンプルで使いやすいプロパティです。さまざまな属性形式を扱える処理ライブラリ。その中には、JSON の解析と生成もサポートされています。 Boost.PropertyTree は RapidJSON よりわずかに遅いですが、いくつかの機能もあります:
以下は、Boost.PropertyTree を使用して JSON を生成および解析するサンプル コードです。
#include <iostream> #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/json_parser.hpp> using namespace std; using boost::property_tree::ptree; using boost::property_tree::read_json; using boost::property_tree::write_json; int main() { // 生成JSON ptree pt; pt.put("name", "Tom"); pt.put("age", 20); // 解析JSON string json_str; write_json(cout, pt); cout << endl; read_json("test.json", pt); cout << "name: " << pt.get<string>("name") << endl; cout << "age: " << pt.get<int>("age") << endl; return 0; }
JsonCpp は C JSON ライブラリ。行動規範 API と DOM スタイル API をサポートします。このうち、JsonCpp の DOM API は RapidJSON の Value クラスに似ています。 JsonCpp の特徴は次のとおりです:
以下は、JsonCpp を使用して JSON を生成および解析するサンプル コードです。
#include <iostream> #include <json/json.h> using namespace std; using namespace Json; int main() { // 生成JSON Value root; root["name"] = "Tom"; root["age"] = 20; string json_str = root.toStyledString(); cout << json_str << endl; // 解析JSON Reader reader; Value value; reader.parse("{"name":"Tom","age":20}", value, false); cout << "name: " << value["name"].asString() << endl; cout << "age: " << value["age"].asInt() << endl; return 0; }
Nlohmann.Json は最新の、軽量で使いやすい JSON 処理ライブラリです。オブジェクト指向 API を提供し、C 11 以降の標準をサポートします。 Nlohmann.Json の特徴は次のとおりです:
次は、Nlohmann.Json を使用して JSON を生成および解析するサンプル コードです。
#include <iostream> #include <nlohmann/json.hpp> using namespace std; using json = nlohmann::json; int main() { // 生成JSON json j; j["name"] = "Tom"; j["age"] = 20; string json_str = j.dump(); cout << json_str << endl; // 解析JSON json j2 = json::parse("{"name":"Tom","age":20}"); cout << "name: " << j2["name"] << endl; cout << "age: " << j2["age"] << endl; return 0; }
C での JSON 処理の実装
上記では、一般的に使用される 4 つの C を紹介しています。 JSON処理ライブラリ、具体的な実装を見てみましょう。
まず、RapidJSON ライブラリをプロジェクトに導入する必要があります。その後、DOM API を使用して JSON を解析および生成できます。 DOM メソッドは、JSON オブジェクト全体をメモリに読み取り、Value クラスに格納します。
JSON の生成:
// 生成JSON Value root(kObjectType); Value person(kObjectType); person.AddMember("name", "Tom", allocator); person.AddMember("age", 20, allocator); root.AddMember("person", person, allocator); StringBuffer buffer; Writer<StringBuffer> writer(buffer); root.Accept(writer); cout << buffer.GetString() << endl;
JSON の解析:
// 解析JSON Document d; d.Parse("{"person":{"name":"Tom","age":20}}"); const Value& person = d["person"]; const string name = person["name"].GetString(); const int age = person["age"].GetInt();
Boost.PropertyTree の使用は次のとおりです。プロジェクトに boost ライブラリを導入すると、ptree クラスを使用して JSON を解析して生成できるようになります。 ptreeはツリー構造になっており、JSONを読み込んだ後、ptreeのget関数で対応する値を取得することができます。
JSON の生成:
// 生成JSON ptree root; ptree person; person.put("name", "Tom"); person.put("age", 20); root.add_child("person", person); stringstream stream; write_json(stream, root); cout << stream.str() << endl;
JSON の解析:
// 解析JSON ptree root; read_json("test.json", root); const string name = root.get<string>("person.name"); const int age = root.get<int>("person.age");
JsonCpp を使用するには、プロジェクトに JsonCpp ライブラリを導入する必要があります。次に、Value クラスを使用して JSON を解析および生成できます。 JsonCpp の Value クラスは、文字列、数値、ブール値などの複数のタイプの値をサポートします。
JSON の生成:
// 生成JSON Value root; Value person; person["name"] = "Tom"; person["age"] = 20; root["person"] = person; cout << root.toStyledString() << endl;
JSON の解析:
// 解析JSON Reader reader; Value value; string json_str = "{"person":{"name":"Tom","age":20}}"; reader.parse(json_str, value); const string name = value["person"]["name"].asString(); const int age = value["person"]["age"].asInt();
Nlohmann.Json の使用には json が必要です。 hpp ファイルがプロジェクトに導入されると、json オブジェクトを使用して JSON を解析および生成できます。 Nlohmann.Json は、さまざまな STL コンテナー タイプの変換を提供します。
JSON の生成:
// 生成JSON json j; j["person"]["name"] = "Tom"; j["person"]["age"] = 20; cout << j.dump() << endl;
JSON の解析:
// 解析JSON json j2 = json::parse("{"person":{"name":"Tom","age":20}}"); const string name = j2["person"]["name"]; const int age = j2["person"]["age"];
概要
この記事では、C で一般的に使用される 4 つの JSON 処理ライブラリ (RapidJSON、Boost) を紹介します。 、JsonCpp、Nlohmann.Json の特徴と実装方法について説明します。これらのオープンソース ライブラリを使用すると、JSON カプセル化の解析と生成を簡単に実行できます。実際の使用では、開発者は最良の結果を得るために、プロジェクトのニーズに最も適した JSON ライブラリを選択する必要があります。
以上がJSON の処理方法と C++ での実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。