当前位置: 首页 > news >正文

【 FastJSON 】解析多层嵌套

以下是使用 FastJSON 的 TypeReference 来解析该 JSON 数据的完整代码示例:

{"msg": "操作成功","code": 0,"data": {"total": 29,"rows": [{"deviceName": null,"deviceNo": "2303811032000001","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030002","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030001","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030003","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030004","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030005","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030006","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030009","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030008","runningStatus": 1,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030011","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030010","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030014","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030013","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030016","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030015","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030017","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030018","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030020","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030019","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030023","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": "","deviceNo": "2303812072030024","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": "","y": ""}, {"deviceName": null,"deviceNo": "2303812072030025","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030022","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030027","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030028","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030026","runningStatus": 2,"onlineStatus": 1,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030012","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030007","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}, {"deviceName": null,"deviceNo": "2303812072030021","runningStatus": 2,"onlineStatus": 2,"flow": "0","sumWater": "0.0","dayWater": "0.0","dayTime": "0.0","x": null,"y": null}]}
}

FastJSON 解析解决方案

根据您提供的 JSON 数据,我将展示如何使用 FastJSON 正确解析这种结构的数据。

1. 首先定义对应的 Java 类

// 设备信息类
public class DeviceInfo {private String deviceName;private String deviceNo;private Integer runningStatus;private Integer onlineStatus;private String flow;private String sumWater;private String dayWater;private String dayTime;private String x;private String y;// getters and setters...
}// 数据分页类
public class PageData<T> {private Integer total;private List<T> rows;// getters and setters...
}// API响应类
public class ApiResponse<T> {private String msg;private Integer code;private T data;// getters and setters...
}

2. 使用 FastJSON 解析 JSON

方法一:直接解析完整结构

String jsonString = "..."; // 您的JSON字符串// 解析完整的响应结构
ApiResponse<PageData<DeviceInfo>> response = JSON.parseObject(jsonString, new TypeReference<ApiResponse<PageData<DeviceInfo>>>() {}
);// 使用数据
System.out.println("响应消息: " + response.getMsg());
System.out.println("总设备数: " + response.getData().getTotal());
for (DeviceInfo device : response.getData().getRows()) {System.out.println("设备编号: " + device.getDeviceNo());System.out.println("在线状态: " + device.getOnlineStatus());
}

方法二:分步解析

// 第一步:解析为JSONObject
JSONObject jsonObject = JSON.parseObject(jsonString);// 第二步:获取data部分
JSONObject dataObject = jsonObject.getJSONObject("data");// 第三步:解析rows数组
List<DeviceInfo> deviceList = JSON.parseArray(dataObject.getString("rows"), DeviceInfo.class
);// 使用数据
for (DeviceInfo device : deviceList) {System.out.println("设备编号: " + device.getDeviceNo());
}

3. 处理可能的问题

处理 null 值

FastJSON 默认会忽略 null 值,如果需要保留:

// 在解析时配置
Feature[] features = new Feature[]{Feature.AllowArbitraryCommas,Feature.IgnoreNotMatch,Feature.DisableCircularReferenceDetect
};
ApiResponse response = JSON.parseObject(jsonString, ApiResponse.class, features);

自定义字段名映射

如果 JSON 字段名与 Java 字段名不一致,可以使用 @JSONField 注解:

public class DeviceInfo {@JSONField(name = "deviceNo")private String deviceId;// 其他字段...
}

4. 完整示例

public class Main {public static void main(String[] args) {String jsonString = "..."; // 您的JSON字符串// 解析JSONApiResponse<PageData<DeviceInfo>> response = JSON.parseObject(jsonString,new TypeReference<ApiResponse<PageData<DeviceInfo>>>() {});// 输出结果System.out.println("响应消息: " + response.getMsg());System.out.println("响应代码: " + response.getCode());System.out.println("总记录数: " + response.getData().getTotal());System.out.println("\n设备列表:");for (DeviceInfo device : response.getData().getRows()) {System.out.printf("设备编号: %s, 在线状态: %d, 运行状态: %d%n",device.getDeviceNo(),device.getOnlineStatus(),device.getRunningStatus());}}
}

这样就能正确解析您提供的 JSON 数据结构了。关键点在于使用 TypeReference 来处理泛型类型的解析,确保嵌套的泛型结构能够正确映射。

http://www.lryc.cn/news/571453.html

相关文章:

  • 希尔脚本简介及常用命令代码整理
  • 20倍光学镜头怎么实现20+20倍数实现
  • Spring @OnApplicationEvent 典型用法
  • MacOS15.5 MySQL8 开启 mysql_native_password
  • 【入门级-基础知识与编程环境:计算机的历史和常见用途】
  • 【RocketMQ 生产者和消费者】- 消费者重平衡(2)- 分配策略
  • 338比特位技术
  • element ui el-table嵌套el-table,实现checkbox联动效果
  • 轻松搭建Linux开发环境:使用`build-essential`安装GCC编译器**
  • Flask设计网页截屏远程电脑桌面及切换运行程序界面
  • 软件体系结构-论述、设计、问答
  • C++---类和对象(中)
  • BERT介绍
  • 失业学习-前端工程化-webpack基础
  • 智慧城市-城市道路塌方检测数据集VOC+YOLO格式768张1类别
  • 微軟將開始使用 Copilot Vision 監控 Windows 10 和 11 用戶的螢幕
  • 视频点播web端AI智能大纲(自动生成视频内容大纲)的代码与演示
  • 【matlab】图片转视频
  • 【PDF提取表格】批量提取PDF里的内容保存到Excel表格,批量提取PDF文档中的信息到Excel的具体步骤和注意事项
  • FPGA基础 -- Verilog门级建模之奇偶校验电路
  • ollama部署开源大模型
  • VS和VS Code 对比和区别
  • 【图像处理入门】9. 基础项目实战:从去噪到图像加密
  • 计算机视觉课程笔记-机器学习中典型的有监督与无监督学习方法的详细分类、标签空间性质、解释说明,并以表格形式进行总结
  • 论文笔记 <交通灯> IntelliLight:一种用于智能交通灯控制的强化学习方法
  • 2025年- H82-Lc190--322.零钱兑换(动态规划)--Java版
  • 海康威视GigE工业相机的python调用demo
  • 2.8 获取IMU数据与航向锁定
  • Kafka 4.0.0集群部署
  • 二十四、【用户管理与权限 - 篇六】前端动态展现:基于权限的菜单与按钮控制