C/C++学習ノート-rapidjsonの簡単な使用
4014 ワード
Answer:rapidjsonはC++のJSON解析器とジェネレータです.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フォーマットは、次のように複雑な場合があります.
{
"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);