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

Java使用Gson反序列化JSON时下划线key转驼峰格式异常如何解决?

问题解决方案

异常原因定位与修复方案

1. 数组仅保留最后一个对象问题

  • 核心原因:自定义JsonDeserializer实现逻辑错误,常见两种情况:
    • 遍历JSON数组时复用同一个Company对象实例,每次修改属性都会覆盖之前的取值,最终列表里所有元素都是最后一次赋值的结果
    • 遍历过程中反复创建新的列表容器,没有累加所有解析完成的对象
  • 修复参考代码:
// 正确的数组解析逻辑
JsonArray companyArray = jsonElement.getAsJsonArray();
List<Company> companyList = new ArrayList<>();
for (JsonElement element : companyArray) {
    // 每次循环新建独立的Company实例,禁止复用
    Company company = new Company();
    JsonObject obj = element.getAsJsonObject();
    company.setCompanyName(obj.get("company_name").getAsString());
    company.setCountryOfOrigin(obj.get("country_of_origin").getAsString());
    companyList.add(company);
}

2. Manufacturing键被转为全小写问题

  • 核心原因:两种常见触发场景:
    • 手动在自定义反序列化器中处理外层分类键时,调用了toLowerCase()方法强制转小写
    • 未显式指定特殊键名映射,直接使用了全局小写转换的命名策略
  • 修复方法:
    • 优先使用Gson原生注解实现特殊键名映射,在外层实体类对应字段上加@SerializedName("Manufacturing"),无需修改全局命名规则
    • 若使用自定义反序列化器处理外层键,直接使用原始键名做匹配,不要强制转小写

最优简化方案(无需自定义反序列化器)

无需自己实现JsonDeserializer,直接用Gson原生能力即可满足需求,可完全规避上述两个异常:

  1. 定义实体类结构:
// 外层实体类
public class CompanyData {
    private List<Company> tech;
    // 注解指定匹配JSON中首字母大写的键
    @SerializedName("Manufacturing")
    private List<Company> manufacturing;
    // 省略getter、setter
}

// 企业实体类
public class Company {
    // Gson命名策略会自动匹配下划线格式的JSON键
    private String companyName;
    private String countryOfOrigin;
    // 省略getter、setter
}
  1. 构造Gson实例直接反序列化:
Gson gson = new GsonBuilder()
    // 全局配置下划线<->驼峰的自动转换规则
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create();
CompanyData data = gson.fromJson(yourJsonStr, CompanyData.class);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:39:03