QJson

Qjson

Json数组的数据格式:Json数组

json数组支持:整型、浮点、字符串、布尔类型、json数组、json对象、空值:null
类型一致
[1,2,3,4,5]//整型
["aaa","bbb","ccc"]//字符串
类型不一致
[12,12.34,true,"aaaaa",null]
数组嵌套使用
[
[1,2,3],
["aa",1,null],
["aaa","ccc","dddd"],
]
json对象:对象使用{}来描述,每个Json对象可以存储若干个元素,每个元素对应一个键值对(key:value),元素与元素之间逗号间隔
1.键值(key)必须是字符串。
2.value值与json数组支持格式相同,json数组换成json对象
例子:
{
	"name":"zhangsan",
	"sex":"man",
	"famiy":
	{
        "age":11;
		"father":"lisi",
		"mother":"wangwu",
	}
}
如上可见,一个元素对应一个键值,元素可以为一个json对象。并且键值不允许重复

json的类

1.QJsonValue

其构造函数是一个重载函数:可以将各种数据类型的转换为Json类型。

2.QjsonObject

通过insert方法,x.insert(Qstring &key,QJsonValue &value)向对象中插入键值队和元素
通过key值得到对应数据 value(key);//暂定

json:一种数据格式,什么语言都可以使用

	QString led_statu;
    if(ui->pb_led->text()=="led_on")
    {
        led_statu = "@led_on#.";
    }
    else
    {
        led_statu = "@led_off#.";
    }
	QJsonValue led_Statu=QJsonValue(led_statu);
    QJsonObject led;
/**************************************************/
上面代码处理,由于要下发led的状态,但是led的状态是一个变量,如果直接下发字符串,那么只能发送一种指令,这里使用一个字符串将经过判断后的指令存起来。然后再将它转换为qjson类型装入即可。
/**************************************************/
    led.insert("num",11);
    led.insert("LEDSwitch",1);
    led.insert("esp",led_Statu);
    QJsonValue a;
    a = QJsonValue(led);
    obj.insert("id",1703080197486);
    obj.insert("params",a);
    obj.insert("version","1.0");
    obj.insert("method","thing.event.property.post");
    QJsonDocument ment(obj);
    str = ment.toJson();

上面代码执行后的结果如下

"{\n
   \"id\": 1703080197486,\n
    \"method\": \"thing.event.property.post\",\n
    \"params\": 
	{\n     \"LEDSwitch\": 1,\n
        \"esp\": \"@led_off#.\",\n
        \"num\": 11\n    
    },\n
        \"version\": \"1.0\"\n
}\n"

封装 添加 key value 到Jsonobject ----> Qjsonducument - --> string ;

解析 string -----> Qjsonducument ----> object ------- >key value;

多种数据类型整和成 Qstring

封装

void Widget::on_pushButton_clicked()
{
    //cli->publish(QString("qq"),"{}");
    QJsonObject obj;
    obj.insert("id",0);
    obj.insert("lamp",true);
    QJsonDocument ment(obj);
    QByteArray str = ment.toJson();
    qDebug() << str;
    cli->publish(QString("1694097863323/APP2AIOTSIM"),str);
}

解析

void Widget:: do_recv(QByteArray msg,QMqttTopicName topic)
{

       // msg  //对msg解析
    qDebug() << msg;

        QJsonDocument ment = QJsonDocument:: fromJson(msg);   //msg 字符数组 ---->  qjsondocument

        QJsonObject obj =  ment.object();  //   json文档 ---> json对象

        double hum  = obj.value("hum").toDouble();
        //qjsonvalue --> double    通过key : hum  得到value
        double tem  =  obj.value("tem").toDouble();

        ui->line_hem->setText(QString::number(hum)); // double -- >Qstring
        ui->line_tem->setText(QString::number(tem)); // double -- >Qstring
}

QT的多层JSON格式解析

		{"deviceType":"CustomCategory",
         "iotId":"TRwDtZRYJHWBQrcfCChOk01an0",
         "requestId":"null",
         "checkFailedData":{},
         "productKey":"k01an9vsyUV",
         "gmtCreate":1708763713531,
         "deviceName":"ESP8266_LED",
         "items":
         {"LED":
          {"time":1708763713520,
           "value":"1"
          }
         }
        }

		QJsonDocument ment = QJsonDocument::fromJson(message);//得到的信息转换为JSON文件
        QJsonObject obj = ment.object();//将json文件格式转换为object格式
        QJsonValue value = obj.value("items");//找到obj对象的items键值对的内容,复制给value

        QJsonObject obj1 = value.toObject();//将items中的内容赋值给obj1
        QJsonValue value1 = obj1.value("LED");//寻找obj1键值对LED内容并且赋值给value1

        QJsonObject obj2 = value1.toObject();//将LED键值对内容转换为object格式并赋值
        QString value2 = obj2.value("value").toString();//找到value中的值转为string格式。
        ui->lineEdit->setText(value2);

注意:最后一个元素后面不要加逗号,键值必须唯一,对于json数组和json对象不能并列,并且父子级别的json对象和json数组混用。

posted @ 2024-02-24 16:50  喜欢嵌入式编程的吗喽  阅读(70)  评论(0)    收藏  举报