【 FastJSON 】解析多层嵌套

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

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 类

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

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

java 复制代码
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());
}

方法二:分步解析

java 复制代码
// 第一步:解析为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 值,如果需要保留:

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

自定义字段名映射

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

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

4. 完整示例

java 复制代码
public class Main {
    public static void main(String[] args) {
        String jsonString = "..."; // 您的JSON字符串
        
        // 解析JSON
        ApiResponse<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 来处理泛型类型的解析,确保嵌套的泛型结构能够正确映射。

相关推荐
REDcker3 分钟前
前端打包工具 - Rollup 打包工具笔记
前端·笔记
前端大卫6 分钟前
动态监听DOM元素高度变化
前端·javascript
前端大卫20 分钟前
Webpack 老项目的优化实践
前端
开利网络28 分钟前
合规底线:健康产品营销的红线与避坑指南
大数据·前端·人工智能·云计算·1024程序员节
lkbhua莱克瓦2438 分钟前
Java基础——集合进阶用到的数据结构知识点1
java·数据结构·笔记·github
yinuo39 分钟前
纯CSS&JS实现:丝滑渐变过渡的动态导航栏
前端
qq. 280403398439 分钟前
vue介绍
前端·javascript·vue.js
未来之窗软件服务44 分钟前
未来之窗昭和仙君(五十五)标签票据打印模板设计器——东方仙盟筑基期
前端·打印设计器·仙盟创梦ide·东方仙盟·昭和仙君·东方仙盟架构
Mr.Jessy1 小时前
Web APIs 学习第五天:日期对象与DOM节点
开发语言·前端·javascript·学习·html
前端大卫1 小时前
如何统一前端项目的 Node 版本和包管理器?
前端