You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:32:22