使用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
相关产品推荐
相关产品推荐

