添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如解析以上复杂的嵌套数据。主要使用到QT中的QJson操作json文件的四个类(QJsonDocument、QJsonArray、QJsonObject,QJsonParseError,QJsonValue)

类名 作用
QJsonArray 封装 JSON 数组
QJsonDocument 读写 JSON 文档
QJsonObject 封装 JSON 对象
QJsonObject::iterator 用于遍历QJsonObject的 STL 风格的非 const 遍历器
QJsonParseError 报告 JSON 处理过程中出现的错误
QJsonValue 封装 JSON 值

首先可以使用 QJsonDocument::fromJson() 从基于文本的表示转化为 QJsonDocument, toJson() 则可以反向转化为文本。

int MainWindow::JsonParseValue()
    QByteArray data = ui->textEdit->toPlainText().toUtf8();
    QJsonParseError json_error;
    QJsonDocument doucment = QJsonDocument::fromJson(data, &json_error);
    //判断jsonDoc是否为空并是否转换成功
    if (!doucment.isNull()&&json_error.error == QJsonParseError::NoError) {
        //再判断是否为json数组
        if (doucment.isArray())
            QJsonArray array = doucment.array();  // 转数组
            GetoneArray(array);
        //如果直接是json对象则直接读取数据
        else if (doucment.isObject()) {
            //构建json对象
            const QJsonObject obj = doucment.object();
            qDebug()<<"obj="<<obj;
            GetoneObject(obj);
        else {
           QMessageBox::information(this,"error","数据格式错误");
           goto JSEXIT;
    }else{
        qDebug()<<"json error:"<<json_error.errorString();
        goto JSEXIT;
    return 0;
JSEXIT:
    return -1;

如果要查询一个 JSON 文档是否包含一个数组或一个对象,使用 isArray() 和 isObject()。包含在文档中的数组或对象可以使用 array() 或 object() 检索,然后读取或操作。

在解析过程中,先判断 QJsonValue 是否为对应的类型如 isObject(),再通过 toObject() 转化,如果是Array则可以通过toArray()转换。

//获取该通道json对象嵌套的json
void MainWindow::GetoneObject(QJsonObject obj)
     QStringList strList = obj.keys();
     for (int i = 0; i < obj.size(); i++)
         QJsonValue val = obj.value(strList.at(i));
         //当value值也是一个json对象时
         if (val.isObject())
             GetoneObject(val.toObject());
             qDebug()<<"GetoneObject object:"<<i+1;
         else if(val.isArray()){
             GetoneArray(val.toArray());
             qDebug()<<"GetoneObject isArray:"<<i+1;
             qDebug()<<"GetoneObject isArray data:"<<val.toVariant().toByteArray();
         else{
             //json对象中是值
             ui->textEdit_2->append(strList.at(i));
             ui->textEdit_2->append(val.toVariant().toByteArray());
//获取该通道json对象中嵌套的数组
void MainWindow::GetoneArray(QJsonArray array)
    int nSize = array.size();
    qDebug() << "GetoneArraysize=" <<nSize;
    for (int i = 0; i < nSize; ++i)
        if(array.at(i).isObject())
            const QJsonObject obj = array.at(i).toObject();
            qDebug()<<"GetoneArray object:"<<i+1;
            GetoneObject(obj);
        else if(array.at(i).isArray()){
            GetoneArray(array.at(i).toArray());
            qDebug()<<"GetoneArray array:"<<i+1;
        else {
            //数组中是值
            ui->textEdit_2->append(array.at(i).toVariant().toByteArray());

最后调用测试

    int ret = JsonParseValue();
    if(ret == 0){
        ui->ResultLed->setText("完成");
    else {
        ui->ResultLed->setText("出错");

很好的解决了数组中包含json对象,json对象中包含数组的问题。(解析具体某个值可以在根据QJsonObject相关操作函数如find,value等)

单纯的json解析也是支持的。

parse json.

obj= QJsonObject({"netCfg":[1,1,1,1,1,1,1,1]})

GetoneArraysize= 8

GetoneObject isArray: 1

 记录一下  有误的地方恳请指正。

为什么要写这个自定义注解,因为需求需要处理一批比较复杂json(如果只有一个,直接手动写代码解析就好),众所周知批量且类似的工作,最好抽象出来。这也符合编程的风格,不重复造轮子,但是需要造轮子。【前面铺垫比较长,如果需求比较复杂json可以直接划到最下面,粘贴自定义注解类 和 自定义注解解析工具类】需要的字段也恰好是对应上的 java对象 解析方法 二、二星难度jsonjson对象中出现层级】 难度加大一些,比如,出现了层级 简单解析的话,我们可以再新建一个Like对象,如: MySQL 5.7简单JSON串就不说了,很简单,来个复杂点的: 在MySQL数据库中,它长这个样子:网上很多都是先对象,然后再嵌套数组,但是我的数据先是个数组,然后嵌套对象,然后再嵌套数组。这种情况下,该如何查询呢?现在想查询,JSON串中城市字段是上海的。............ 在开发中经常需要将json字符串转换为java对象或者list数组,这样方便我们来使用这些数据,下面就来介绍一下怎样将json字符串和json数组转换为Java对象或者list数组。在大括号{…}中书写,包含多个key/value(键/值)对,key必须是字符串,value可以是合法的JSON数据类型(字符串,数字,对象,数组,布尔值或null)例如一个最简单的没有嵌套JSON对象{“name”18,“site”null}转换大体上分为两种https。...... 1 引言: 在数据解析过程中,json格式的数据多用来做前后端数据交互、接口数据交互等,弄清楚Java语言中解析json嵌套数组对于数据交互有着重要意义,本文基于自己的代码编写和逻辑梳理,整理出本篇干货,亲测有效。 2 理论: 2-1 json字符串和json对象的区别: //格式区别: //JSON字符串: var str='{"name":"xiaoming","age":24}'; //JSON对象: var obj={"name":"xiaoming","age":24}; 2-2 简单的解析js 复杂JSON解析 {"reason":"查询成功!","result":{"city":"苏州","realtime":{"temperature":"17","humidity":"69","info":"阴","wid":"02","direct":"东风","power":"2级","aqi":"30"},"future":[{"date":"2021-10-25","temperature":"12\/21℃","weather":"多云","wid":{"day":"01","night":"0 public class Moblie_Utils { public static String loadJson(String url) { StringBuilder json = new Stri... 所周知,在早期Spark版本中就已经支持读取Json格式的数据文件,并能够直接转换为数据库表,以方便我们进行处理数据,在本篇文章中我们将介绍如何通过Spark API很简... 1 []中括号代表的是一个数组;2 {}大括号代表的是一个对象3 双引号“”表示的是属性值4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。