
Gson默认按Java字段名匹配JSON键名,当JSON中使用下划线命名(如my_number)而POJO中为驼峰命名(如myNumber)时,因名称不匹配导致字段未被赋值,默认初始化为0。需通过@SerializedName注解显式指定映射关系。
gson默认按java字段名匹配json键名,当json中使用下划线命名(如`my_number`)而pojo中为驼峰命名(如`mynumber`)时,因名称不匹配导致字段未被赋值,默认初始化为0。需通过`@serializedname`注解显式指定映射关系。
在使用 Gson 进行 JSON 反序列化时,字段名匹配是严格基于 Java 类成员变量名与 JSON 键名的一致性。你提供的 POJO 中定义了 double myNumber,但 JSON 数据中对应的键是 "my_number" —— 二者命名风格不同(驼峰 vs 下划线),Gson 默认不会自动做命名转换,因此 myNumber 字段无法被正确填充,保持其 double 类型的默认初始值 0.0。
✅ 正确做法:使用 @SerializedName 注解
为明确建立 JSON 键与 Java 字段的映射关系,应在对应字段上添加 @SerializedName 注解:
import com.google.gson.annotations.SerializedName;
public class MyPojo {
String id;
@SerializedName("my_number")
double myNumber;
}随后,直接使用 gson.fromJson(jsonString, MyPojo.class) 即可正确解析:
String json = "{\"id\": \"id1\", \"my_number\": 10.0}";
MyPojo pojo = gson.fromJson(json, MyPojo.class);
System.out.println(pojo.myNumber); // 输出:10.0⚠️ 注意事项:
- @SerializedName 必须与 Gson 库一同使用(确保已引入 com.google.code.gson:gson);
- 若需全局统一处理下划线转驼峰(如所有 snake_case → camelCase),可配置 FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES:
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();该策略会自动将 my_number 映射到 myNumber,无需逐个添加注解,适合统一规范的项目。
✅ 总结:字段值为 0 的根本原因是 Gson 未能完成字段绑定,而非类型转换错误;解决核心在于显式声明 JSON 键名与 Java 字段的对应关系——优先推荐 @SerializedName,兼顾灵活性与可读性;大规模场景下可启用命名策略实现自动化映射。

















