java基本数据类型默认值在json解析中表现不一致,核心在于字段是否参与序列化、是否被设为null及框架对“未赋值”语义的处理逻辑不同:基本类型未赋值时取语言默认值(0/false/0.0),但json无“未设置”概念;jackson/gson/fastjson反序列化缺失字段时均填语言默认值,但配置灵活性不同——jackson支持@jsonsetter(defaultvalue)、gson默认严格、fastjson可强制输出null为零;输出与否取决于字段类型(基本型vs包装类)、注解(如@jsoninclude)和全局配置。

基本数据类型默认值本身不会出现在JSON中
Java中int、boolean、double等基本类型声明后即有默认值(0、false、0.0),但JSON是纯文本格式,没有“未设置”概念。因此:
- 如果字段是
int age;且未显式赋值,Jackson/Gson默认不会输出该字段(除非开启SerializationFeature.WRITE_NULL_MAP_VALUES之类非默认选项); - 如果字段是
Integer age;(包装类),未赋值时为null,此时是否输出取决于框架配置——默认通常跳过null字段; - JSON字符串里根本不存在
"age":0,不代表Java对象里age是0,只代表它没被写入;反序列化时才决定这个0从哪来。
Jackson对基本类型字段的反序列化行为
当JSON不含某个基本类型字段时,Jackson默认将其设为Java语言级默认值:
-
{"name":"Alice"}→ 反序列化到class Person { int age; String name; }→age == 0(不是null,不可判空); - 若想让缺失字段反序列化失败,需配置:
mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true)(仅对构造器参数生效)或使用@JsonSetter(nulls = Nulls.FAIL); - 若想统一用包装类型规避默认值陷阱,推荐把
int全改为Integer,并配合@JsonInclude(JsonInclude.Include.NON_NULL)控制输出。
Gson与Fastjson的差异点
三者对“缺失字段→基本类型”的填充逻辑一致(都填语言默认值),但可控性不同:
-
Gson:默认严格,缺失字段直接设为0/false;可通过
GsonBuilder.serializeNulls()让null字段也输出,但对基本类型无效(它没有null); -
Fastjson:提供
@JSONField(serialzeFeatures = ...),支持WriteNullNumberAsZero等——即强制把null的Integer输出为"age":0,但注意这改变的是输出,不影响反序列化逻辑; -
Jackson:最灵活,可用
@JsonSetter(defaultValue = "42")为缺失字段指定默认值(String/number支持),比语言默认值更业务友好。
真正影响输出的关键是字段定义方式+注解+全局配置
不要只看“基本类型默认值”,而要看你如何声明字段、是否加了注解、是否改了序列化策略:
- 用
int+@JsonProperty(required = true)?Jackson反序列化会报错(要求JSON必须含该字段); - 用
Integer+@JsonInclude(NON_ABSENT)?null和Optional.empty()都不输出; - 用
int+@JsonInclude(NON_DEFAULT)?值为0时不输出(但注意:0是默认值,也是合法业务值,慎用); - 所有框架中,
boolean active = true;若JSON无"active",反序列化后仍是true——这是Java初始化行为,不是JSON框架“赋予”的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











