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。说白了,不是类型转换出错,是压根没对上号。 那么,该怎么解决这个“对不上号”的毛病?
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 gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
配置好之后,Gson会默认把JSON中的`my_number`映射到Java类的`myNumber`字段,无需再逐个加注解。这对于大型项目或规范统一的接口系统来说,无疑是更省力的做法。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述