ホームページ >バックエンド開発 >C++ >JSON の処理方法と C++ での実装

JSON の処理方法と C++ での実装

王林
王林オリジナル
2023-08-21 23:58:432554ブラウズ

JSON は、読み書きが簡単で、機械による解析と生成が簡単な軽量のデータ交換形式です。 JSON 形式を使用すると、さまざまなシステム間でのデータ転送が簡単になります。 C には、JSON 処理用のオープンソース JSON ライブラリが多数あります。この記事では、一般的に使用される JSON 処理メソッドと C での実装をいくつか紹介します。

C での JSON 処理メソッド

  1. RapidJSON

RapidJSON は、DOM、SAX、およびインメモリ プール スタイル API を提供する高速 C JSON パーサー/ジェネレーターです。その主な機能は次のとおりです:

  • 小さいメモリ使用量と高速な実行速度;
  • UTF-8、UTF-16、UTF-32 およびその他のエンコード形式をサポート;
  • C 11 移動セマティクスをサポートしてメモリ管理をより効率的にします;
  • SAX スタイル API をサポートし、大きな 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;
}
  1. Boost.PropertyTree

Boost.PropertyTree は、シンプルで使いやすいプロパティです。さまざまな属性形式を扱える処理ライブラリ。その中には、JSON の解析と生成もサポートされています。 Boost.PropertyTree は RapidJSON よりわずかに遅いですが、いくつかの機能もあります:

  • INI ファイル、XML、JSON などを含む複数のデータ形式をサポート;
  • C をサポート標準ライブラリと BOOST ライブラリ
  • のデータ型にはプラグ可能なデータ形式処理機能があり、ユーザーは独自の拡張形式を作成できます。

以下は、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;
}
  1. JsonCpp

JsonCpp は C JSON ライブラリ。行動規範 API と DOM スタイル API をサポートします。このうち、JsonCpp の DOM API は RapidJSON の Value クラスに似ています。 JsonCpp の特徴は次のとおりです:

  • は UTF-8 エンコーディングをサポートします;
  • は JSON 解析と生成をサポートします;
  • はオブジェクト指向のカプセル化された API を提供します;
  • C 11 移動セマティクスをサポートします。

以下は、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;
}
  1. Nlohmann.Json

Nlohmann.Json は最新の、軽量で使いやすい JSON 処理ライブラリです。オブジェクト指向 API を提供し、C 11 以降の標準をサポートします。 Nlohmann.Json の特徴は次のとおりです:

  • 単一ファイルのヘッダー実装、使いやすい;
  • 複数の STL コンテナーをサポート;
  • 非常に軽量、ヘッダーのみ;
  • フォーマットされた出力は非常に分かりやすいです。

次は、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処理ライブラリ、具体的な実装を見てみましょう。

  1. RapidJSON 実装

まず、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();
  1. Boost.PropertyTree の実装

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");
  1. JsonCpp 実装

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();
  1. Nlohmann.Json 実装

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。