首页 > 编程语言 >Gson反序列化整数字段为0的解决方法

Gson反序列化整数字段为0的解决方法

来源:互联网 2026-07-14 08:06:11

Gson反序列化时字段值默认变为0,因JSON下划线命名与Java驼峰命名不匹配,导致字段未被正确赋值而初始化为0。可通过@SerializedName注解显式指定JSON字段名与Java字段名的映射关系,或使用FieldNamingPolicy设置全局下划线转驼峰命名策略来解决。

Gson默认按Java字段名匹配JSON键名,当JSON中使用下划线命名(如my_number)而POJO中为驼峰命名(如myNumber)时,因名称不匹配导致字段未被赋值,默认初始化为0。需通过@SerializedName注解显式指定映射关系。
在实际开发中,不难遇到这样的场景:用Gson解析一段JSON数据,满心期待地取某个字段的值,结果发现它稳稳地躺在那里——值为0。明明JSON里写的是个非零数值,为什么解析出来就变了味? 问题的源头其实挺简单:Gson在找字段匹配时,采取的是“字面匹配”策略。它会拿你的Java类字段名,去JSON的键名堆里逐个对照。如果你的字段叫`myNumber`,而JSON里写的是`my_number`,Gson就认为这个字段不存在,顺手就给了一个double类型的默认初始值——0.0。说白了,不是类型转换出错,是压根没对上号。 那么,该怎么解决这个“对不上号”的毛病?

最直接的办法:@SerializedName 注解

要告诉Gson“这个Java字段对应的是JSON里的那个键”,直接在字段上标明就好:
import com.google.gson.annotations.SerializedName;

public class MyPojo {
    String id;
    @SerializedName("my_number")
    double myNumber;
}
这样一来,无论JSON键取名多么随性,只要映射关系写清楚,Gson都能准确把值塞进来。测试一下:
String json = "{\"id\": \"id1\", \"my_number\": 10.0}";
MyPojo pojo = gson.fromJson(json, MyPojo.class);
System.out.println(pojo.myNumber); // 输出:10.0
结果稳稳当当,问题迎刃而解。 这里有一点要特别留意:`@SerializedName`注解是Gson库自带的零件,你必须确保项目中已经正确引入了Gson依赖才能使用(`com.google.code.gson:gson`)。另外,如果整个项目都统一使用下划线命名风格,每个字段都加注解确实有点繁琐。这时可以换个思路:用全局命名策略来一劳永逸。

进阶方案:全局命名策略

Gson提供了`FieldNamingPolicy`,可以一次性解决下划线转驼峰的问题:
Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create();
配置好之后,Gson会默认把JSON中的`my_number`映射到Java类的`myNumber`字段,无需再逐个加注解。这对于大型项目或规范统一的接口系统来说,无疑是更省力的做法。

总结

字段值变成0,根源不在数据类型转换,而是Gson压根没找到你想要的字段。解决的路径很清晰:要么用`@SerializedName`注解逐个精准对齐,要么通过`FieldNamingPolicy`全局搞定命名转换。前者灵活、可读性强,后者适合大规模统一场景。选哪个,取决于你的项目风格和实际需求。关键是——让Gson明确知道,哪个Java字段该吃哪块JSON饼干。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。