【 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 来处理泛型类型的解析,确保嵌套的泛型结构能够正确映射。

相关推荐
小码哥_常2 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮4 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
她说可以呀6 小时前
Vue插槽
前端·javascript·vue.js
qq_448011166 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
aixingpan6 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352907 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算