> 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里的那个键”,直接在字段上标明就好:
```java
import com.google.gson.annotations.SerializedName;
public class MyPojo {
String id;
@SerializedName("my_number")
double myNumber;
}
```
这样一来,无论JSON键取名多么随性,只要映射关系写清楚,Gson都能准确把值塞进来。测试一下:
```java
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反序列化整数字段值变为0的排查与解决
Gson反序列化时字段值默认变为0,因JSON下划线命名与Java驼峰命名不匹配,导致字段未被正确赋值而初始化为0。可通过@SerializedName注解显式指定JSON字段名与Java字段名的映射关系,或使用FieldNamingPolicy设置全局下划线转驼峰命名策略来解决。
字段值无故变0?一文说清Gson反序列化的命名匹配陷阱
> 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里的那个键”,直接在字段上标明就好:
```java
import com.google.gson.annotations.SerializedName;
public class MyPojo {
String id;
@SerializedName("my_number")
double myNumber;
}
```
这样一来,无论JSON键取名多么随性,只要映射关系写清楚,Gson都能准确把值塞进来。测试一下:
```java
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默认按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里的那个键”,直接在字段上标明就好:
```java
import com.google.gson.annotations.SerializedName;
public class MyPojo {
String id;
@SerializedName("my_number")
double myNumber;
}
```
这样一来,无论JSON键取名多么随性,只要映射关系写清楚,Gson都能准确把值塞进来。测试一下:
```java
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`)。另外,如果整个项目都统一使用下划线命名风格,每个字段都加注解确实有点繁琐。这时可以换个思路:用全局命名策略来一劳永逸。
### 来源:https://www.php.cn/faq/2818918.html
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。
相关推荐
补充同频道和同主题内容,方便继续浏览更多相关内容。
同类最新
继续查看同栏目最近更新的文章。
Linux route命令详解:查看与修改IP路由表
route命令源自net-tools工具包,用于查看和修改Linux内核IP路由表,但自2009年起已废弃,现代推荐使用iproute命令。由于历史惯性,route仍在生产环境大量存在,且仅能操作main表,需注意新发行版默认未安装。
Python部署Scikit-learn模型为FastAPI微服务
部署Scikit-learn模型为FastAPI微服务时,需用joblib加载模型,请求体应为二维数组,并添加输入校验(类型转换、维度检查、NaN过滤),生产环境使用uvicorn多worker启动,配合错误处理与日志记录,确保服务稳定高效。
CentOS系统中实现Golang日志自动轮转的配置方法
在CentOS上使用logrotate管理Golang应用日志轮转:安装后编写配置文件,设置每天轮转、保留7份、压缩、不处理空日志,创建新日志权限640;手动测试配置无误后通过cron每日自动执行,实现日志按天切分、压缩与清理。
如何高效解决SQL中IN子句超过1000个元素的限制
针对Oracle等数据库IN子句1000项上限,可通过子查询、分批执行、EXISTS关联子查询等方案突破限制,兼顾查询性能与可维护性,避免字符串拼接反模式,同时提升SQL灵活性与数据库兼容性。
CentOS Java日志记录速度优化与性能提升指南
在CentOS环境下优化Java日志记录速度,需采用Log4j2异步日志解耦业务线程,生产环境日志级别设为WARN或ERROR,配合日志轮转与SSD存储;调整缓冲区大小、简化格式化、优化JVM堆与GC策略,并利用无锁设计避免锁竞争。通过监控工具定位瓶颈,分布式系统可引入集中式日志收集。
