如解析以上复杂的嵌套数据。主要使用到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对象
解析方法
二、二星难度json【json对象中出现层级】
难度加大一些,比如,出现了层级
简单解析的话,我们可以再新建一个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 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。