Java使用Gson反序列化JSON时下划线key转驼峰格式异常如何解决?
问题解决方案
异常原因定位与修复方案
1. 数组仅保留最后一个对象问题
- 核心原因:自定义
JsonDeserializer实现逻辑错误,常见两种情况:- 遍历JSON数组时复用同一个
Company对象实例,每次修改属性都会覆盖之前的取值,最终列表里所有元素都是最后一次赋值的结果 - 遍历过程中反复创建新的列表容器,没有累加所有解析完成的对象
- 遍历JSON数组时复用同一个
- 修复参考代码:
// 正确的数组解析逻辑 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"),无需修改全局命名规则 - 若使用自定义反序列化器处理外层键,直接使用原始键名做匹配,不要强制转小写
- 优先使用Gson原生注解实现特殊键名映射,在外层实体类对应字段上加
最优简化方案(无需自定义反序列化器)
无需自己实现JsonDeserializer,直接用Gson原生能力即可满足需求,可完全规避上述两个异常:
- 定义实体类结构:
// 外层实体类 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 }
- 构造Gson实例直接反序列化:
Gson gson = new GsonBuilder() // 全局配置下划线<->驼峰的自动转换规则 .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create(); CompanyData data = gson.fromJson(yourJsonStr, CompanyData.class);
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

