rapidJson

目前还不知道如何访问,下面类型的数据

[
{},{}
]

解析字符串

{
"key":[{},{}]
}
Document doc;
doc.Parse(strConfig.c_str());
ParseErrorCode error(kParseErrorNone);
error = doc.GetParseError();
if (error != kParseErrorNone)
{
return;
}
if (!doc.HasMember("dev_th") || !doc["dev_th"].IsArray())
{
return;
}
Value & arrAlarmHost = doc["dev_th"];
for (int index = 0; index < arrAlarmHost.Size(); ++index)
{
Value &objDev = arrAlarmHost[index];
if (!objDev.HasMember("port") || !objDev["port"].IsInt())
{
continue;
}
}

解析对象数组

"defendConfig" :
[
{
"addr" : "01234567",
"defendCode" : "008",
"name" : "东南角防区"
},
{
"addr" : "7654321",
"defendCode" : "009",
"name" : "西南角防区"
}
]

Document doc;
doc.Parse(m_sCmd.c_str());
ParseErrorCode error(kParseErrorNone);
if (false == doc.HasParseError() &&
doc.IsArray())
{
for (size_t i = 0; i < doc.Size(); ++i)
{
Value& v = doc[i];
tagDHFlowCountRegion region;
region.addr = v["addr"].GetInt();
region.defendCode = v["defendCode"].GetInt();
region.strName = v["name"].GetString();
m_vecConfig.emplace_back(region);
}
}

构建 json

/*
{
"layout":"2*2",
"Settings":
[
{
"group":"1",
"windows":"1#2",
"cycletime":"10",
"channels":
[
{
"loginID":"1234",
"channel":"2"
}
]
}
]
}
*/
void TestGenerateJsonArray()
{
string result = "";
rapidjson::StringBuffer strBuf;
//rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(strBuf);

writer.StartObject();
writer.Key("layout");
writer.String("2*2");


writer.Key("Settings");
writer.StartArray();
writer.StartObject();
writer.Key("group");
writer.String("1");
writer.Key("windows");
writer.String("1#2");
writer.Key("cycletime");
writer.String("10");
writer.Key("channels");
writer.StartArray();
writer.StartObject();
writer.Key("loginID");
writer.String("1234");
writer.Key("channel");
writer.String("2");
writer.EndObject();
writer.EndArray();
writer.EndObject();
writer.EndArray();
writer.EndObject();
result = strBuf.GetString();
cout << result << endl;
}
Document docHuminity; // Null
docHuminity.SetArray();
rapidjson::Document::AllocatorType& allocatorHuminity = docHuminity.GetAllocator();
for (auto it = m_mapDevInfo[id_cmd_chan].listChartDataTemperature.begin();it != m_mapDevInfo[id_cmd_chan].listChartDataTemperature.end();++it)
{
rapidjson::Value obj;
obj.SetObject();
obj.AddMember("name",rapidjson::StringRef(it->strName.c_str()),allocatorHuminity);

rapidjson::Value arr(rapidjson::kArrayType);
arr.PushBack(rapidjson::StringRef(it->strDatetime.c_str()), allocatorHuminity);
arr.PushBack(rapidjson::StringRef(it->strValue.c_str()), allocatorHuminity);

obj.AddMember("value",arr,allocatorHuminity);
docHuminity.PushBack(obj,allocatorHuminity);
}
rapidjson::StringBuffer bufferH;
rapidjson::Writer<rapidjson::StringBuffer> writerH(bufferH);
docHuminity.Accept(writerH);
strChartHumidity = bufferH.GetString();

对象数组

"value" : 
[
{
"addr" : "01234567",
"defendCode" : "008",
"name" : "东南角防区"
},
{
"addr" : "7654321",
"defendCode" : "009",
"name" : "西南角防区"
}
]

rapidjson::Document jsonDoc;
rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); //获取分配器
//将当前的Document设置为一个object,也就是说,整个Document是一个Object类型的dom元素
jsonDoc.SetObject();
//生成array
rapidjson::Value jsonArr(rapidjson::kArrayType);//创建一个Array类型的元素

for (auto iter = m_vecConfig.begin(); iter != m_vecConfig.end(); ++iter)
{
string sdev;
// 构建json字符串

// 添加属性
jsonDoc.AddMember("name", iter->strName, allocator);
jsonDoc.AddMember("addr", iter->strAddr, allocator);
jsonDoc.AddMember("defendCode", iter->strDefendCode, allocator);

jsonArr.PushBack(jsonDoc, allocator);
}

转字符串

std::string JsonToString(rapidjson::Value& valRoot)
{
    rapidjson::StringBuffer strBuf;
    strBuf.Clear();
    rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
    valRoot.Accept(writer);
    std::string strJson = strBuf.GetString();
    return strJson;
}

综合样例

//生成一串如下的json格式字符串,并解析
// {
// "name":"qfl",
// "age":20,
// "letter":["a","b","c"],
// "location": {"province":"fujian","city":"xiamen","number":16}
// "book":[{"name":"book1", "isbn":"123"},{"name":"book2","isbn":"456"}],
// "healthy":true,
// }

//生成Json串
rapidjson::Document jsonDoc; //生成一个dom元素Document
rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); //获取分配器
jsonDoc.SetObject(); //将当前的Document设置为一个object,也就是说,整个Document是一个Object类型的dom元素

//添加属性
jsonDoc.AddMember("name", "qfl", allocator); //添加字符串值
jsonDoc.AddMember("age", 20, allocator); //添加int类型值

//生成array
rapidjson::Value letterArray(rapidjson::kArrayType);//创建一个Array类型的元素
letterArray.PushBack("a", allocator);
letterArray.PushBack("b", allocator);
letterArray.PushBack("c", allocator);
jsonDoc.AddMember("letter", letterArray, allocator); //添加数组

//生成一个object
rapidjson::Value locationObj(rapidjson::kObjectType);//创建一个Object类型的元素
locationObj.AddMember("province", "fujian", allocator);
locationObj.AddMember("city", "xiamen", allocator);
locationObj.AddMember("number", 16, allocator);
jsonDoc.AddMember("location", locationObj, allocator); //添加object到Document中

//生成一个object数组
rapidjson::Value bookArray(rapidjson::kArrayType);//生成一个Array类型的元素,用来存放Object
rapidjson::Value book1(rapidjson::kObjectType); //生成book1
book1.AddMember("name", "book1", allocator);
book1.AddMember("isbn", "123", allocator);
bookArray.PushBack(book1, allocator); //添加到数组

rapidjson::Value book2(rapidjson::kObjectType); //生成book2
book2.AddMember("name", "book2", allocator);
book2.AddMember("isbn", "456", allocator);
bookArray.PushBack(book2, allocator); //添加到数组
jsonDoc.AddMember("book", bookArray, allocator);

//添加属性
jsonDoc.AddMember("healthy", true, allocator); //添加bool类型值
// jsonDoc.AddMember("sports", NULL, allocator);//添加空值,这里会导致报错

//生成字符串
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jsonDoc.Accept(writer);

std::string strJson = buffer.GetString();
log("-----生成的Json:\n%s", strJson.c_str());

//写到文件
std::string strPath = FileUtils::getInstance()->getWritablePath() + "JsonFile.txt";
FILE* myFile = fopen(strPath.c_str(), "w"); //windows平台要使用wb
if (myFile) {
fputs(buffer.GetString(), myFile);
fclose(myFile);
}

//JsonFile.txt文件内容
//{"name":"qfl","age":20,"letter":["a","b","c"],"location":{"province":"fujian","city":"xiamen","number":16},"book":[{"name":"book1","isbn":"123"},{"name":"book2","isbn":"456"}],"healthy":true}

log("-----读取Json内容:");
//从文件中读取(注意和上面分开,不能确定文件是否生成完毕,这里读取可能有问题)
rapidjson::Document newDoc;
myFile = fopen(strPath.c_str(), "r"); //windows平台使用rb
if (myFile) {
rapidjson::FileStream inputStream(myFile); //创建一个输入流
newDoc.ParseStream<0>(inputStream); //将读取的内容转换为dom元素
fclose(myFile); //关闭文件,很重要
}
//判断解析从流中读取的字符串是否有错误
if (newDoc.HasParseError()) {
log("Json Parse error:%d", newDoc.GetParseError()); //打印错误编号
}
else {
//获取json串中的数据
//先判断是否有这个字段,如果使用不存在的key去取值会导致直接崩溃
if (newDoc.HasMember("name")) {
log("name:%s", newDoc["name"].GetString()); //必须要获取对应的数据类型,rapidjson不会帮你转换类型
}
else {}

if (newDoc.HasMember("age")) {
log("age:%d", newDoc["age"].GetInt()); //获取正确的类型
}
else {}

if (newDoc.HasMember("letter")) {
rapidjson::Value letter; //使用一个新的rapidjson::Value来存放array的内容
letter = newDoc["letter"];

//确保它是一个Array,而且有内容
if (letter.IsArray() && !letter.Empty()) {
//遍历Array中的内容
for (rapidjson::SizeType i = 0; i < letter.Size(); i++) {
log("letter:%s", letter[i].GetString());
}
}
else {}
}
else {}

if (newDoc.HasMember("location")) {
rapidjson::Value location; //使用一个新的rapidjson::Value来存放object
location = newDoc["location"];

//确保它是一个Object
if (location.IsObject()) {

if (location.HasMember("province")) {
log("location:province:%s", location["province"].GetString());
}
else {}
if (location.HasMember("city")) {
log("location:city:%s", location["city"].GetString());
}
else {}
if (location.HasMember("number")) {
log("location:number:%d", location["number"].GetInt());
}
else {}
}
else {}
}
else {}

//book是一个包含了2个object的array。按照上面的步骤来取值就行
if (newDoc.HasMember("book")) {
rapidjson::Value book;
book = newDoc["book"];

//先取Array
if (book.IsArray() && !book.Empty()) {

rapidjson::Value tempBook;
for (rapidjson::SizeType i = 0; i < book.Size(); i++) {
tempBook = book[i]; //Array中每个元素又是一个Object

if (tempBook.IsObject()) {

if (tempBook.HasMember("name") && tempBook.HasMember("isbn")) {
log("book:%d:name:%s, isbn:%s", i, tempBook["name"].GetString(), tempBook["isbn"].GetString());
}
else {}
}
else {}
}
}
else {}
}
else {}

if (newDoc.HasMember("healthy")) {
if (newDoc["healthy"].GetBool()) {
log("healthy:true");
}
else {
log("healthy:false");
}
}
else {}
}