Spring Boot返回数据丢失布尔false、截断double值的配置调整咨询
解决Spring Boot返回JSON时布尔false被忽略、Double类型10.0被截断的问题
这问题我做项目时也踩过坑,本质是Spring Boot默认依赖的Jackson序列化框架的默认规则在搞鬼,调整下配置就能搞定,给你两种实用方案:
方案一:全局配置(推荐,统一应用所有接口)
直接在application.yml或application.properties里添加Jackson序列化规则,整个应用的JSON返回都会遵循这个规则。
YAML配置方式(application.yml)
spring: jackson: # 强制序列化所有属性,包括值为false的布尔类型、null值等 default-property-inclusion: ALWAYS serialization: # 禁止将Double类型的整数形式(比如10.0)自动转换为整数(10) write-doubles-as-strings: false # 确保Jackson不会把浮点数自动转成整数类型 allow-non-numeric-numbers: false
Properties配置方式(application.properties)
# 强制包含所有属性,解决布尔false被忽略问题 spring.jackson.default-property-inclusion=ALWAYS # 禁止将Double转成字符串,同时保留浮点格式,避免10.0被截断为10 spring.jackson.serialization.write-doubles-as-strings=false spring.jackson.serialization.allow-non-numeric-numbers=false
配置说明:
default-property-inclusion: ALWAYS:告诉Jackson不管属性值是false、null还是其他默认值,都要把这个字段序列化到JSON里,直接解决布尔false被忽略的问题。- Double相关配置:关闭
write-doubles-as-strings避免转成字符串,通过allow-non-numeric-numbers确保Jackson不会把10.0这类浮点数自动截断成整数10。
方案二:局部注解(针对单个类/字段)
如果只是个别类或字段需要特殊处理,不用全局改配置,可以用Jackson的注解单独设置:
处理布尔类型字段
在需要保留false的布尔字段或整个类上添加@JsonInclude(JsonInclude.Include.ALWAYS)注解:
import com.fasterxml.jackson.annotation.JsonInclude; // 作用于整个类的所有字段 @JsonInclude(JsonInclude.Include.ALWAYS) public class YourEntity { private boolean isEnabled = false; // 或者单独给字段加注解 @JsonInclude(JsonInclude.Include.ALWAYS) private boolean isDeleted = false; // 其他字段... }
处理Double类型字段
要确保10.0不被转成10,可以用注解指定格式,或者自定义序列化器:
方法1:用@JsonFormat指定格式
import com.fasterxml.jackson.annotation.JsonFormat; public class YourEntity { @JsonFormat(shape = JsonFormat.Shape.NUMBER, pattern = "#.0") private double price = 10.0; // 其他字段... }
方法2:自定义序列化器(更灵活)
如果需要更复杂的逻辑(比如只对整数形式的浮点数保留.0,其他正常输出),可以写个自定义序列化器:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class DoubleKeepDecimalSerializer extends JsonSerializer<Double> { @Override public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value != null) { // 判断是否是整数形式的浮点数,是的话输出带.0的格式 if (value == value.intValue()) { gen.writeNumber(String.format("%.1f", value)); } else { gen.writeNumber(value); } } } }
然后在字段上应用这个序列化器:
import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class YourEntity { @JsonSerialize(using = DoubleKeepDecimalSerializer.class) private double amount = 10.0; // 其他字段... }
验证
配置完成后重启应用,测试接口返回的JSON数据,就能看到布尔类型的false字段被正常返回,10.0也不会被截断成10了。
内容的提问来源于stack exchange,提问作者nullpointer
相关产品推荐
相关产品推荐

