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

GSON序列化子对象问题:JSON结构与关联对象序列化实现

解决JSON与Java对象序列化的匹配问题

看起来你在把指定JSON序列化到自定义Java对象时遇到了几个关键的不匹配问题,我来帮你一步步修正解决:

首先梳理核心问题点

你当前的代码和定义存在三个主要冲突:

  1. JSON结构与解析目标不匹配:你的原始JSON是单个ParentClass对象(用{}包裹),但你却用了TypeToken<List<ParentClass>>去解析,这会直接导致解析失败——因为Gson会期望JSON是数组格式([]包裹)。
  2. 字段类型不匹配:
    • JSON里的number是数字类型(1),但你的ParentClass里定义的是String number;
    • JSON里的subRank是数字类型,但SubClass里定义的是String subRank;
  3. 字段名称不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:14