You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gson转换含嵌套JSON数组的内容为Java类时sensors为null如何解决

问题根因

Gson默认严格区分JSON键名与Java类字段名的大小写,你提供的JSON串中数组键名是大写开头的Sensors,但ServiceFlowData类中定义的字段是小写开头的sensors,二者名称不匹配,Gson无法完成自动映射,因此字段未被赋值,调用get方法返回null。

解决方法

以下方案按推荐优先级排序:

方案1:使用@SerializedName注解指定映射键名(最推荐,不破坏Java命名规范)

在POJO字段上添加Gson提供的@SerializedName注解,显式声明该字段对应JSON中的键名即可:

import com.google.gson.annotations.SerializedName;

public class ServiceFlowData {
    // 显式指定对应JSON中的Sensors键
    @SerializedName("Sensors")
    public ArrayList<Sensor> sensors;
    
    public ArrayList<Sensor> getSensors() {
        return sensors;
    }

    public void setSensors(ArrayList<Sensor> sensors) {
        this.sensors = sensors;
    }
} 

该方案不需要修改原有解析逻辑,也符合Java小驼峰的字段命名规范。

方案2:修改POJO字段名与JSON键名完全匹配

直接把类中的字段名调整为和JSON键名一致的大写开头:

public class ServiceFlowData {
    // 字段名与JSON键名完全一致
    public ArrayList<Sensor> Sensors;
    
    public ArrayList<Sensor> getSensors() {
        return Sensors;
    }

    public void setSensors(ArrayList<Sensor> sensors) {
        this.Sensors = sensors;
    }
} 

该方案会破坏Java的标准命名规范,仅适合临时调试使用。

方案3:配置Gson全局字段命名策略(适合大量键名大小写不匹配的场景)

如果项目中存在大量键名首字母大写、Java字段首字母小写的不匹配场景,可以自定义Gson的字段命名策略统一适配:

Gson gson = new GsonBuilder()
    .setFieldNamingStrategy(field -> {
        // 自动把Java字段名首字母大写后匹配JSON键
        return field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);
    })
    .create();
ServiceFlowData serviceFlowData = gson.fromJson(jsonString,ServiceFlowData.class);
System.out.println("serviceFlowData"+serviceFlowData.getSensors());

内容的提问来源于stack exchange,提问作者avaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:45:05