Qt开发笔记1

Qt解析Json字符串基本操作

第一次写博客,记录下工作中遇到的问题—

对于一个Json字符串如下:
[{
“测试项”: {
“TestName”: “手工”,
“IsPowerOn”: true,
“TestTool”: “J-link”,
“TestType”: “1”
},
“测试项1”: {
“TestName”: “自动”,
“IsPowerOn”: true,
“TestTool”: “J-link”,
“TestType”: “2”
},
“测试项2”: {
“TestName”: “停止”,
“IsPowerOn”: true,
“TestTool”: “J-link”,
“TestType”: “3”
},
“测试点集”: [{
“TestPointName”: “近点”,
“x”: “345”,
“y”: “221”,
“TestResult”: “通过”
}, {
“TestPointName”: “远点”,
“x”: “145”,
“y”: “211”,
“TestResult”: “通过”
}, {
“TestPointName”: “中点”,
“x”: “545”,
“y”: “921”,
“TestResult”: “通过”
}]
}, {
“测试项”: {
“TestName”: “无测试”,
“IsPowerOn”: true,
“TestTool”: “Multimeter”,
“TestType”: “4”
}
}]

1.需要包含的Qt库

在这里插入图片描述
2.具体操作

操作函数如下:
传递参数为const char *是为了后续工作兼容其他开发环境(例如c#),传递string类型等会失败

int json(const char *c_json)

这里传入参数,将const char*转换为QByteArray

/*将const char * 转化为string*/
QString c_json_str = QString::fromStdString(string(c_json));
QByteArray c_doc = QByteArray::fromStdString(c_json_str.toStdString());

下面调用QJsonDocument::fromJson函数解析Json字符串是否合法

/*解析json字符串**/
    QJsonParseError err_rpt;
    QJsonDocument root_Doc = QJsonDocument::fromJson(c_doc,&err_rpt);
    if(err_rpt.error!=QJsonParseError::NoError){
        /*失败*/
        printf("json read fault\r\n");
        return -1;
    }else{
        /*成功*/
        printf("json read success\r\n");
    }

转化为数组形式(根据实际传入的Json字符串具体分析)

/*
     * 如果字符串外层为{},那么将QJsonArray替换为QJsonObject
     */

    QJsonArray json_array = root_Doc.array();

根据上面的Json字符串进行遍历,主要用到的类有QJsonObject,OJsonArray,对于非数组形式的字符串需要用到迭代器QJsonObject::iterator进行操作

/*遍历json字符串*/
    for(int i = 0;i<json_array.size();i++){
        QJsonObject json_child_obj = json_array[i].toObject();
        QJsonObject::iterator iter;
        for(iter = json_child_obj.begin();iter != json_child_obj.end();iter++){
            QString str = iter.key();
            if(!!str.compare("测试点集")){
                QJsonObject s_obj = iter.value().toObject();
                qDebug() << str << ":" <<s_obj["TestName"].toString()
                         << s_obj["IsPowerOn"].toBool()
                         << s_obj["TestTool"].toString()
                         << s_obj["TestType"].toString();
            }else{
                QJsonArray json_child_array = iter.value().toArray();
                for(int k = 0;k<json_child_array.size();k++){

                    QJsonObject a_obj = json_child_array[k].toObject();

                    qDebug() << iter.key() << ":"
                            << "pointname" << a_obj["TestPointName"].toString()
                             << "x:" << a_obj["x"].toString()
                             << "y:" << a_obj["y"].toString()
                             << "TestResult" << a_obj["TestResult"].toString();
                }
            }
        }
    }

如此即完成了对Json字符串的遍历
现附上完整代码如下:

#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QFile>
#include <QDebug>
#include <qtextcodec.h>
#include <iostream>
#include <string.h>
#include <string>
int json(const char *c_json);
int main(int argc,char **argv)
{

    QFile file("C:/Users/Administrator/Desktop/json9.txt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QByteArray value = file.readAll();
    file.close();
    string s = value.toStdString();
    const char *test_str = s.c_str();
    json(test_str);
    return 0;
}
int json(const char *c_json)
{
    /*将const char * 转化为string*/
    QString c_json_str = QString::fromStdString(string(c_json));
    QByteArray c_doc = QByteArray::fromStdString(c_json_str.toStdString());

    /*解析json字符串**/
    QJsonParseError err_rpt;
    QJsonDocument root_Doc = QJsonDocument::fromJson(c_doc,&err_rpt);
    if(err_rpt.error!=QJsonParseError::NoError){
        /*失败*/
        printf("json read fault\r\n");
        return -1;
    }else{
        /*成功*/
        printf("json read success\r\n");
    }

    /*
     * 如果字符串外层为{},那么将QJsonArray替换为QJsonObject
     */

    QJsonArray json_array = root_Doc.array();

    /*遍历json字符串*/
    for(int i = 0;i<json_array.size();i++){
        QJsonObject json_child_obj = json_array[i].toObject();
        QJsonObject::iterator iter;
        for(iter = json_child_obj.begin();iter != json_child_obj.end();iter++){
            QString str = iter.key();
            if(!!str.compare("测试点集")){
                QJsonObject s_obj = iter.value().toObject();
                qDebug() << str << ":" <<s_obj["TestName"].toString()
                         << s_obj["IsPowerOn"].toBool()
                         << s_obj["TestTool"].toString()
                         << s_obj["TestType"].toString();
            }else{
                QJsonArray json_child_array = iter.value().toArray();
                for(int k = 0;k<json_child_array.size();k++){

                    QJsonObject a_obj = json_child_array[k].toObject();

                    qDebug() << iter.key() << ":"
                            << "pointname" << a_obj["TestPointName"].toString()
                             << "x:" << a_obj["x"].toString()
                             << "y:" << a_obj["y"].toString()
                             << "TestResult" << a_obj["TestResult"].toString();
                }
            }
        }
    }
    return 0;
}

测试结果如下:

在这里插入图片描述
感谢每一位大佬的付出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值