C/C++学習ノート-rapidjsonの簡単な使用

4014 ワード

  • rapidjsonとは何ですか.なぜrapidjsonを選んだのですか. 

  • Answer:rapidjsonはC++のJSON解析器とジェネレータです.rapidjsonはサードパーティライブラリに依存せず、ヘッダファイルのみを含み、使い勝手が簡単です.
  • rapidjsonはどのようにインストールしますか?

  • Answer:rapidjsonのインストールは簡単です.ヘッダファイルのみが含まれており、サードパーティ製ライブラリに依存していないためです.私たちはファイルをダウンロードするだけで使えます.ファイルのダウンロード先:https://github.com/Tencent/rapidjson.git.rapidjsonの公式サイト資料:http://rapidjson.org/zh-cn/.
    ダウンロードした後、includeディレクトリを開きます.これが私たちに必要なものです.それから、これを私たちのエンジニアリングパスに直接コピーします.もしエラーがあったら、コピーしてから接続したかどうかを確認します.接続方法:ecilpse->Roject->Properties->C/C++General->Paths and Symbols->includes.とても簡単です.
    必要なjsonフォーマットは、次のように複雑な場合があります.
  • rapidjson複雑なjson列
  • を生成する
    {
        "name":"jack",//   
        "age":18,
        "sub":["a","b"],//value   
        "elp":[ {"a":"A","b":"B"},//value                json  
                {"c":"C","d":"D"},
              ]
    }
    std::string build_json_msg(){
    
    	rapidjson::Document doc;//  DOM  
    	doc.SetObject();
    	rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();//       
    
    	//     
    	doc.AddMember("name","jack",allocator);
    	doc.AddMember("age",18,allocator);
    	//====      ====["1","2"]
    		rapidjson::Value array_sub(rapidjson::kArrayType);//          
    		array_sub.PushBack("a",allocator);
    		array_sub.PushBack("b",allocator);
    	//================
    	doc.AddMember("sub",array_sub,allocator);
    	//====    object===[{"1":2,},{}]
    		rapidjson::Value array_json(rapidjson::kArrayType);
    			rapidjson::Value obj(rapidjson::kObjectType);//          json  
    				obj.AddMember("a","A",allocator);
    				obj.AddMember("b","B",allocator);
    			array_json.PushBack(obj,allocator);
    
    			rapidjson::Value obj1(rapidjson::kObjectType);//          json  
    				obj1.AddMember("c","C",allocator);
    				obj1.AddMember("d","D",allocator);
    			array_json.PushBack(obj1,allocator);
    			array_json.PushBack(obj1,allocator);
    	doc.AddMember("elp",array_json,allocator);
    
    
    	rapidjson::StringBuffer s;
    	rapidjson::Writer<:stringbuffer> writer(s);
    	doc.Accept(writer);
    
    	return std::string(s.GetString());
    
    }

    生成するには、Document、AllocatorTypeという非常に重要なオブジェクトがいくつか必要です.最初の3行のコードは比較的固定されていて、まずdocと分配器を明らかにします.
    rapidjson::Document doc;//  DOM  
    doc.SetObject();
    rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();//       

    json要素を追加するには主にdoc.AddMember(key,value,分配器)の形式で生成します.jsonフォーマットが簡単であれば、コードも簡単です.以下のようにします.
    doc.AddMember("name","jack",allocator);
    doc.AddMember("age",18,allocator);

    ただし、配列に関連する場合は.注意が必要です.まず、配列タイプのオブジェクトを作成する必要があります.そして配列の中身をPushBackに入れます.最後に同じdoc.AddMember()を追加します.でもvalueはarrayになったsub.AddMember()の2番目のパラメータは、値だけでなくオブジェクトであってもよいことを示す.
    rapidjson::Value array_sub(rapidjson::kArrayType);//          
    		array_sub.PushBack("a",allocator);
    		array_sub.PushBack("b",allocator);
    	//================
    doc.AddMember("sub",array_sub,allocator);

    同様に、配列の中にjson列がある場合は、どうすればいいですか?実は書き方は上の論理に従って、上のコードを見て、ただ“a”をobjectタイプに変えただけです.具体的な書き方は以下の通りです.
    //====    object===[{"1":2,},{}]
    		rapidjson::Value array_json(rapidjson::kArrayType);
    			rapidjson::Value obj(rapidjson::kObjectType);//          json  
    				obj.AddMember("a","A",allocator);
    				obj.AddMember("b","B",allocator);
    			array_json.PushBack(obj,allocator);
    
    			rapidjson::Value obj1(rapidjson::kObjectType);//          json  
    				obj1.AddMember("c","C",allocator);
    				obj1.AddMember("d","D",allocator);
    			array_json.PushBack(obj1,allocator);
    			array_json.PushBack(obj1,allocator);
    	doc.AddMember("elp",array_json,allocator);
  • rapidjson解析複雑なjson列