モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

RapidJSON の基本的な使い方

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2020/01/27
最終更新最終更新
2022/05/02
記事区分記事区分
一般公開

目次

    博士課程学生です。電子工作はただの趣味です。

    C++ で JSON を扱う際に利用されるライブラリの一つに RapidJSON があります。基本的な使い方を記載します。

    インストール

    cmake を利用してビルドすると簡単です。

    ヘッダーファイルのみが必要となります。

    git clone https://github.com/Tencent/rapidjson.git
    ls rapidjson/include/
    rapidjson
    

    CMakeLists.txt

    cmake_minimum_required (VERSION 3.10)
    add_executable(main main.cpp)
    target_include_directories(main PRIVATE rapidjson/include)
    

    main.cpp

    各値は rapidjson::Value として扱われます。rapidjson::Document は DOM を表現しており、一つ以上の rapidjson::Value を持ちます。

    #include <rapidjson/document.h>
    #include <rapidjson/writer.h>
    #include <rapidjson/stringbuffer.h>
    #include <iostream>
    
    int main() {
    
        // JSON 文字列をパースして DOM に変換します。
        std::string json = "{\"project\":\"rapidjson\",\"stars\":10}";
        rapidjson::Document d;
        d.Parse(json.c_str());
    
        // 内容を Get/Set します。
        rapidjson::Value& s = d["stars"];
        s.SetInt(s.GetInt() + 1);
    
        // buffer、writer を作成した上で、DOM と関連付けます。
        rapidjson::StringBuffer buffer;
        rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
        d.Accept(writer);
    
        // buffer を経由して値を文字列として取り出せます。
        std::cout << buffer.GetString() << std::endl;
    
        return 0;
    }
    

    ビルドおよび実行例

    mkdir build
    cd build/
    cmake ..
    make
    ./main
    {"project":"rapidjson","stars":11}
    

    サンプルコード

    #include <rapidjson/document.h>
    #include <rapidjson/writer.h>
    #include <rapidjson/stringbuffer.h>
    #include <iostream>
    
    int main() {
    
        // 検証用の JSON を用意します。
        std::string json = "{\"key\":\"aaa\", \"key2\":123, \"key3\":true, \"\key4\": null, \"\key5\":1.23}";
        rapidjson::Document d;
        d.Parse(json.c_str());
    
        std::string json2 = "[{\"key\":\"aaa\", \"key2\":123}]";
        rapidjson::Document d2;
        d2.Parse(json2.c_str());
    
        // root [] または {} です。
        assert(!d.IsArray());
        assert(d.IsObject());
        assert(d2.IsArray());
        assert(!d2.IsObject());
    
        // キーの存在確認
        assert(d.HasMember("key"));
    
        // 型の確認
        assert(d["key"].IsString());
        std::cout << d["key"].GetString() << std::endl; //=> aaa
    
        assert(d["key2"].IsInt());
        std::cout << d["key2"].GetInt() << std::endl; //=> 123
    
        assert(d["key5"].IsDouble());
        std::cout << d["key5"].GetDouble() << std::endl; //=> 1.23
    
        assert(d["key3"].IsBool());
        assert(d["key3"].GetBool());
    
        assert(d["key4"].IsNull());
    
        // JSON 配列
        for(rapidjson::SizeType i = 0; i < d2.Size(); i++) {
            assert(d2[i].IsObject());
            assert(d2[i]["key"].IsString());
        }
    
        // 型の判別
        static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" };
        for (rapidjson::Value::ConstMemberIterator itr = d.MemberBegin(); itr != d.MemberEnd(); ++itr) {
            printf("Type of member %s is %s\n", itr->name.GetString(), kTypeNames[itr->value.GetType()]);
        }
    
        return 0;
    }
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    博士課程学生です。電子工作はただの趣味です。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事