首先准备我们要的头文件
rapidjson/document.h"
rapidjson/writer.h"
rapidjson/stringbuffer.h"
using namespace rapidjson;
现在我们解析一个这样的嵌套json:
{
"code": 0,
"count": 1,
"data": [
{
"batch_id": 1,
"batch_name": "GF052501",
"batch_grade": "AAA",
"defect_desc": "毛丝:16(5.56%);成型:4(1.39%);油污:3(1.04%);绊丝:2(0.69%)",
"total_count": 10200,
"defect_count": 12,
"defect_grade": {
“AA”: 2,
“A”: 3
}
}
]
}
方法如下:
Document doc;
std::string json;
json = CStringUtil::Utf8ToAscii(我们的json字符串);
//string转json
if (!doc.Parse(json.data()).HasParseError())
{
if (doc.HasMember("data")
&& doc["data"].IsObject()
&& !doc["data"].IsNull())
{
const rapidjson::Value& object = doc["data"];
BatchRecord batch;
if (object.HasMember("total_count") && object["total_count"].IsInt())
{
batch.totalCount = object["total_count"].GetInt();
}
if (object.HasMember("defect_count") && object["defect_count"].IsInt())
{
batch.defectCount = object["defect_count"].GetInt();
}
//嵌套部分
if (object.HasMember("defect_grade")
&& object["defect_grade"].IsObject()
&& !object["defect_grade"].IsNull()) {
const rapidjson::Value& gradeObj = object["defect_grade"];
if (gradeObj.HasMember("AA") && gradeObj["AA"].IsInt()){
batch.AACount = gradeObj["AA"].GetInt();
}
if (gradeObj.HasMember("A") && gradeObj["A"].IsInt()) {
batch.ACount = gradeObj["A"].GetInt();
}
if (gradeObj.HasMember("B") && gradeObj["B"].IsInt()) {
batch.BCount = gradeObj["B"].GetInt();
}
if (gradeObj.HasMember("C") && gradeObj["C"].IsInt()) {
batch.OtherCount = gradeObj["C"].GetInt();
}
}
}
}
生成嵌套json,要生成的json如下:
/* 字符串转json */
{
"code": 0,
"count": 3,
"data": [
{
"id": 1,
"name": "早班",
"time": "23:00-07:00"
},
{
"id": 2,
"name": "中班",
"time": "07:00-15:00"
},
{
"id": 3,
"name": "晚班",
"time": "15:00-23:00"
}
]
}
生成方法如下:实际上里面可以在嵌套一层,只要调用好array2和array的关系
rapidjson/document.h
string-util.h
#include <QTextCodec>
CDynProtoValue reply;
CDynProtoValue::Object& replyObj = reply.GetAsObject();
auto &array = replyObj["name"].GetAsArray();
array.resize(listSchedule.size());
auto &array2 = replyObj["time"].GetAsArray();
array2.resize(listSchedule.size());
//组装body数组
int j = 0;
for (auto iter = listSchedule.begin(); iter != listSchedule.end(); iter++)
{
string strNameOne = iter->name;
string strdateOne = iter->date;
strNameOne = CStringUtil::AsciiToUtf8(strNameOne);
strdateOne = CStringUtil::AsciiToUtf8(strdateOne);
array[j] = strNameOne;
array2[j] = strdateOne;
j++;
}