如何使用Gson的fromJson方法将指定JSON转换为Java对象?
JSON转Java对象属性为null的解决方法
问题描述
我有一段特定格式的JSON数据,想用Gson库的fromJson方法转成Java对象,但自己写了对应的Java类(jsonDesc.java和Desc.java)后,转换得到的对象属性值都是null,该怎么解决?
目标JSON格式
{ "desc":[ { "name":"id", "desc":{ "ip_arduino":"value", "id_house":"value", "house_address":"value" } }, { "name":"P1", "desc":{ "field":"panel1", "value":0 } }, { "name":"P2", "desc":{ "field":"panel3", "value":0 } }, { "name":"P3", "desc":{ "field":"panel3", "value":0 } }, { "name":"P4", "desc":{ "field":"panel4", "value":0 } } ] }
我编写的Java类
jsonDesc.java
public class jsonDesc { private ArrayList<Desc> desc = new ArrayList(); }
Desc.java
public class Desc { String name; desc desc; desc1 desc1; public class desc{ String ip_arduino; String id_house; String house_address; } public class desc1{ String name; desc desc; public class desc{ String field; String value; } } }
问题原因及修复方案
你的Java类结构完全不符合JSON的层级映射规则,核心问题包括:
- 属性与内部类同名,导致Gson无法识别映射关系
- 非静态内部类需要外部类实例,Gson无法直接实例化
- 类结构拆分错误,JSON中所有
desc字段属于同一层级的变体,无需拆成两个内部类 - 包访问权限的属性,Gson在部分场景下无法赋值
修复后的Java类(推荐方案)
JsonDesc.java(遵循Java大驼峰命名规范)
import java.util.List; public class JsonDesc { private List<DescItem> desc; // Gson必须的无参构造器 public JsonDesc() {} // 可选:添加getter/setter方便后续操作 public List<DescItem> getDesc() { return desc; } public void setDesc(List<DescItem> desc) { this.desc = desc; } }
DescItem.java
public class DescItem { private String name; private DescContent desc; public DescItem() {} // 可选:添加getter/setter public String getName() { return name; } public void setName(String name) { this.name = name; } public DescContent getDesc() { return desc; } public void setDesc(DescContent desc) { this.desc = desc; } // 静态内部类,包含所有可能的desc字段,不存在的字段会自动设为null public static class DescContent { private String ip_arduino; private String id_house; private String house_address; private String field; private Integer value; public DescContent() {} // 按需添加getter/setter public String getIp_arduino() { return ip_arduino; } public void setIp_arduino(String ip_arduino) { this.ip_arduino = ip_arduino; } public String getId_house() { return id_house; } public void setId_house(String id_house) { this.id_house = id_house; } public String getHouse_address() { return house_address; } public void setHouse_address(String house_address) { this.house_address = house_address; } public String getField() { return field; } public void setField(String field) { this.field = field; } public Integer getValue() { return value; } public void setValue(Integer value) { this.value = value; } } }
转换测试代码
import com.google.gson.Gson; public class Main { public static void main(String[] args) { String jsonStr = "你的JSON字符串内容"; Gson gson = new Gson(); JsonDesc result = gson.fromJson(jsonStr, JsonDesc.class); // 验证转换结果 for (DescItem item : result.getDesc()) { System.out.println("名称:" + item.getName()); if (item.getDesc().getIp_arduino() != null) { System.out.println("ArduinoIP:" + item.getDesc().getIp_arduino()); } else { System.out.println("面板:" + item.getDesc().getField() + ",值:" + item.getDesc().getValue()); } } } }
内容的提问来源于stack exchange,提问作者DiegoM
相关产品推荐
相关产品推荐

