RapidJson与QtJson解析器互操作

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"

/********************************************************
 *
 *              1. 创建QtJson,返回std::string
 *
 * ******************************************************/
std::string MakeQtJson()
{
    /* 构建Json数组 */
    QJsonArray subject;
    subject.append("Mathematic");
    subject.append("Physics");
    subject.append("Biology");
    subject.append("Chemical");
    subject.append("Gymnastic");

    /* 构建Json对象 */
    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("江苏"));

    /* 构建嵌套Json数组 */
    QJsonArray student;
    student.append(QJsonValue(zx));
    student.append(QJsonValue(ls));
    student.append(QJsonValue(ww));

    /* 构建嵌套Json对象 */
    QJsonObject class;
    class.insert("ClassName",QStringLiteral("高三"));
    class.insert("Grade","3");
    class.insert("Student",QJsonValue(student));
    class.insert("Subject",QJsonValue(subject));

    /* 构建Json文档 */
    QJsonDocument document;
    document.setObject(class);

    QByteArray byteArray = document.toJson(QJsonDocument::Compact);
    QString strJson(byteArray);

    return strJson.toStdString();
}

/********************************************************
 *
 *         2. 用RapidJson 解析器解析 QtJson
 *
 * ******************************************************/
bool Rapid_Parse_QtJson(std::string& context)
{
    if(context.empty()) return false;

    //开始解析std::string字符串
    rapidjson::Document dom;
    if (!dom.Parse(context.c_str()).HasParseError())
    {
        //解析Json对象
        if(dom.HasMember("ClassName") && dom["ClassName"].IsString())
        {
            qDebug() <<"ClassName = " << dom["ClassName"].GetString();
        }
        if(dom.HasMember("Grade") && dom["Grade"].IsString())
        {
            qDebug() <<"Grade = " << dom["Grade"].GetString();
        }

        //解析Json数组(嵌套对象)
        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;
                }
            }
        }

        //解析Json数组
        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;
}

/********************************************************
 *
 *           3. 创建RapidJson,返回std::string
 *
 * ******************************************************/
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();
}

/********************************************************
 *
 *         4. 用QtJson 解析器解析 RapidJson
 *
 * ******************************************************/
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);

    //Qt --> Rapid
    std::string strContextQt = MakeQtJson();
    bool bSecc = Rapid_Parse_QtJson(strContextQt);

    //Rapid --> Qt
    std::string strContextRapid = MakeRapidJson();
    bSecc = Qt_Parse_RapidJson(strContextRapid);

    qDebug()<< strContextQt.c_str();

    return a.exec();
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值