RapidJson与QtJson解析器互操作示例
1、JSON内容
{
"ClassName": "高三",
"Grade": "3",
"Student": [
{
"Name": "张三",
"ID": "001",
"Province": "内蒙古"
},
{
"Name": "李四",
"ID": "002",
"Province": "浙江"
},
{
"Name": "王五",
"ID": "003",
"Province": "江苏"
}
],
"Subject": [
"Mathematic",
"Physics",
"Biology",
"Chemical",
"Gymnastic"
]
}
2、解析代码
#include <QCoreApplication>
#include <QDebug>
#include <string>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include "rapidjson/document.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/prettywriter.h"
std::string MakeQtJson()
{
QJsonArray subject;
subject.append("Mathematic");
subject.append("Physics");
subject.append("Biology");
subject.append("Chemical");
subject.append("Gymnastic");
QJsonObject zs;
zs.insert("ID","001");
zs.insert("Name",QStringLiteral("张三"));
zs.insert("Province",QStringLiteral("内蒙古"));
QJsonObject ls;
ls.insert("ID","002");
ls.insert("Name",QStringLiteral("李四"));
ls.insert("Province",QStringLiteral("浙江"));
QJsonObject ww;
ww.insert("ID","003");
ww.insert("Name",QStringLiteral("王五"));
ww.insert("Province",QStringLiteral("江苏"));
QJsonArray student;
student.append(QJsonValue(zx));
student.append(QJsonValue(ls));
student.append(QJsonValue(ww));
QJsonObject class;
class.insert("ClassName",QStringLiteral("高三"));
class.insert("Grade","3");
class.insert("Student",QJsonValue(student));
class.insert("Subject",QJsonValue(subject));
QJsonDocument document;
document.setObject(class);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
return strJson.toStdString();
}
bool Rapid_Parse_QtJson(std::string& context)
{
if(context.empty()) return false;
rapidjson::Document dom;
if (!dom.Parse(context.c_str()).HasParseError())
{
if(dom.HasMember("ClassName") && dom["ClassName"].IsString())
{
qDebug() <<"ClassName = " << dom["ClassName"].GetString();
}
if(dom.HasMember("Grade") && dom["Grade"].IsString())
{
qDebug() <<"Grade = " << dom["Grade"].GetString();
}
if(dom.HasMember("Student") && dom["Student"].IsArray())
{
const rapidjson::Value& student = dom["Student"];
int student_count = student.Size();
for(int i=0;i< student_count;++i)
{
if(student[i].IsObject())
{
qDebug()<<"--------" <<i<<"--------";
const char* id = student[i]["ID"].GetString();
qDebug() <<"ID = " << id;
const char* name = student[i]["Name"].GetString();
qDebug() <<"Name = " << name;
const char* province = student[i]["Province"].GetString();
qDebug() <<"Province = " << province;
}
}
}
if(dom.HasMember("Subject") && dom["Subject"].IsArray())
{
const rapidjson::Value& subjects = dom["Subject"];
int subject_count = subjects.Size();
for(int i=0;i< subject_count;++i)
{
if(subjects[i].IsString())
{
qDebug()<<subjects[i].GetString();
}
}
}
}
return true;
}
std::string MakeRapidJson()
{
rapidjson::StringBuffer jsonInfo;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(jsonInfo);
writer.StartObject();
writer.Key("ClassName"); writer.String("高三");
writer.Key("Grade"); writer.String("Grade");
writer.Key("Student");
writer.StartArray();
writer.StartObject();
writer.Key("ID"); writer.String("001");
writer.Key("Name"); writer.String("张三");
writer.Key("Province"); writer.String("内蒙古");
writer.EndObject();
writer.StartObject();
writer.Key("ID"); writer.String("002");
writer.Key("Name"); writer.String("李四");
writer.Key("Province"); writer.String("浙江");
writer.EndObject();
writer.StartObject();
writer.Key("ID"); writer.String("003");
writer.Key("Name"); writer.String("王五");
writer.Key("Province"); writer.String("江苏");
writer.EndObject();
writer.EndArray();
writer.Key("Subject");
writer.StartArray();
writer.String("Mathematic");
writer.String("Physics");
writer.String("Biology");
writer.String("Chemical");
writer.String("Gymnastic");
writer.EndArray();
writer.EndObject();
return jsonInfo.GetString();
}
bool Qt_Parse_RapidJson(std::string& context)
{
if(context.empty()) return false;
QJsonParseError jsonError;
QJsonDocument doc = QJsonDocument::fromJson(QByteArray(context.c_str()), &jsonError);
if (!doc.isNull() && (jsonError.error == QJsonParseError::NoError))
{
if(doc.isObject())
{
QJsonObject obj_line = doc.object();
if(obj_line.contains("ClassName") && obj_line.value("ClassName").isString())
{
QJsonValue name = obj_line.value("ClassName");
qDebug() <<"ClassName = " << name.toString();
}
if(obj_line.contains("Grade") && obj_line.value("Grade").isString())
{
qDebug() <<"Grade = " << obj_line.value("Grade").toString();
}
if(obj_line.contains("Student") && obj_line.value("Student").isArray())
{
QJsonArray student_array = obj_line.value("Student").toArray();
int student_count = student_array.size();
for(int i=0;i < student_count;++i)
{
QJsonValue obj_value = student_array.at(i);
if(obj_value.isObject())
{
qDebug()<<"--------" <<i<<"--------";
QJsonObject obj = obj_value.toObject();
if(obj.contains("ID"))
qDebug() <<"ID = " << obj.value("ID").toString();
if(obj.contains("Name"))
qDebug() <<"Name = " << obj.value("Name").toString();
if(obj.contains("Province"))
qDebug() <<"Province = " << obj.value("Province").toString();
}
}
}
if(obj_line.contains("Subject") && obj_line.value("Subject").isArray())
{
QJsonValue subjects = obj_line.value("Subject");
QJsonArray subject_array = subjects.toArray();
int subject_count = subject_array.size();
for(int i=0;i < subject_count;++i)
{
QJsonValue value = subject_array.at(i);
qDebug() <<value.toString();
}
}
}
}
else
{
return false;
}
return true;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::string strContextQt = MakeQtJson();
bool bSecc = Rapid_Parse_QtJson(strContextQt);
std::string strContextRapid = MakeRapidJson();
bSecc = Qt_Parse_RapidJson(strContextRapid);
qDebug()<< strContextQt.c_str();
return a.exec();
}