GSON序列化子对象问题:JSON结构与关联对象序列化实现
解决JSON与Java对象序列化的匹配问题
看起来你在把指定JSON序列化到自定义Java对象时遇到了几个关键的不匹配问题,我来帮你一步步修正解决:
首先梳理核心问题点
你当前的代码和定义存在三个主要冲突:
- JSON结构与解析目标不匹配:你的原始JSON是单个
ParentClass对象(用{}包裹),但你却用了TypeToken<List<ParentClass>>去解析,这会直接导致解析失败——因为Gson会期望JSON是数组格式([]包裹)。 - 字段类型不匹配:
- JSON里的
number是数字类型(1),但你的ParentClass里定义的是String number; - JSON里的
subRank是数字类型,但SubClass里定义的是String subRank;
- JSON里的
- 字段名称不匹配:JSON里的数组键是
standing,但你的ParentClass里对应的字段是SubClassList,命名不一致会导致Gson无法映射。
修正后的Java类定义
我们需要调整字段类型、添加名称映射注解,同时确保类有Gson需要的无参构造函数:
import com.google.gson.annotations.SerializedName; import java.util.List; public class ParentClass { private String name; // 修正为int类型,匹配JSON里的数字类型 private int number; // 用@SerializedName映射JSON中的"standing"键 @SerializedName("standing") private List<SubClass> subClassList; // Gson反序列化必须的无参构造函数 public ParentClass() {} // 可选:添加getter/setter方便操作字段 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public List<SubClass> getSubClassList() { return subClassList; } public void setSubClassList(List<SubClass> subClassList) { this.subClassList = subClassList; } } public class SubClass { // 修正为int类型,匹配JSON里的数字类型 private int subRank; private String subname; public SubClass() {} public int getSubRank() { return subRank; } public void setSubRank(int subRank) { this.subRank = subRank; } public String getSubname() { return subname; } public void setSubname(String subname) { this.subname = subname; } }
正确的序列化/反序列化代码
因为你的JSON是单个对象,所以直接解析成ParentClass即可,无需用List:
import com.google.gson.Gson; public class SerializationDemo { public static void main(String[] args) { // 你的原始JSON字符串 String json = "{ \"name\":\"name 1\", \"number\":1, \"standing\":[ { \"subRank\":1, \"subname\":\"test\" }, { \"subRank\":2, \"subname\":\"Test2\" }] }"; Gson gson = new Gson(); // 直接解析为单个ParentClass对象 ParentClass parent = gson.fromJson(json, ParentClass.class); // 测试输出验证结果 System.out.println("Name: " + parent.getName()); System.out.println("Number: " + parent.getNumber()); for (SubClass sub : parent.getSubClassList()) { System.out.printf("子项:Rank=%d,名称=%s%n", sub.getSubRank(), sub.getSubname()); } // 如果需要把Java对象序列化回JSON String serializedJson = gson.toJson(parent); System.out.println("序列化后的JSON:" + serializedJson); } }
额外说明
- 如果你的JSON确实是多个
ParentClass组成的数组(比如[{...}, {...}]),那才需要用TypeToken<List<ParentClass>>来解析,代码会是:Type listType = new TypeToken<List<ParentClass>>() {}.getType(); List<ParentClass> parentList = gson.fromJson(jsonArray, listType); - 如果你必须把JSON里的数字类型转成
String(比如number要保留为String),可以自定义Gson的类型适配器,但优先推荐类型匹配,避免不必要的转换成本。
内容的提问来源于stack exchange,提问作者user5908316
相关产品推荐
相关产品推荐

