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

Java如何在JSON中表示空Integer 空值时保留属性名而非省略

实现方案

完全可以实现,核心需要两步操作:首先开启JSON序列化框架的空值字段输出配置(默认一般是关闭的,所以null值字段会被省略),其次自定义Integer类型的null值序列化规则,匹配你要的输出格式。

以下是国内常用的3种JSON序列化框架的具体实现方式:

1. Jackson(SpringBoot默认序列化框架)

  • 第一步:开启全局null字段输出
    配置ObjectMapper:
    ObjectMapper objectMapper = new ObjectMapper();
    // 序列化时保留所有字段,包括null值
    objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
    
    SpringBoot项目也可以直接在配置文件中添加:
    spring:
      jackson:
        default-property-inclusion: always
    
  • 第二步:自定义Integer类型null序列化器
    public class IntegerNullSerializer extends StdSerializer<Integer> {
        public IntegerNullSerializer() {
            super(Integer.class);
        }
        @Override
        public void serialize(Integer value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            if (value == null) {
                // 按照需求输出空字符串,最终效果为 "score": ""
                gen.writeString("");
                // 如果你需要的是输出null值 即"score": null,改为调用gen.writeNull()即可
                return;
            }
            gen.writeNumber(value);
        }
    }
    
  • 第三步:把自定义序列化器注册到ObjectMapper
    SimpleModule module = new SimpleModule();
    module.addSerializer(Integer.class, new IntegerNullSerializer());
    objectMapper.registerModule(module);
    
    如果只需要单个字段生效,不需要全局配置,直接在对应字段上加注解:
    @JsonSerialize(using = IntegerNullSerializer.class, nullsUsing = IntegerNullSerializer.class)
    private Integer score;
    

2. Fastjson2

  • 第一步:开启null字段输出,序列化时指定WriteNulls特性
  • 第二步:自定义Integer类型序列化器
    public class IntegerNullSerializer implements ObjectSerializer<Integer> {
        @Override
        public void write(JSONWriter jsonWriter, Integer object, Type fieldType, int features) {
            if (object == null) {
                jsonWriter.writeString("");
                return;
            }
            jsonWriter.writeInt(object);
        }
    }
    
  • 第三步:注册序列化器
    全局注册:
    FastjsonConfig.getInstance().register(Integer.class, new IntegerNullSerializer());
    
    单个字段生效:
    @JSONField(serializeUsing = IntegerNullSerializer.class)
    private Integer score;
    

3. Gson

  • 第一步:构建Gson实例时开启null值序列化
    Gson gson = new GsonBuilder().serializeNulls().create();
    
  • 第二步:自定义Integer类型适配器
    public class IntegerTypeAdapter extends TypeAdapter<Integer> {
        @Override
        public void write(JsonWriter out, Integer value) throws IOException {
            if (value == null) {
                out.value("");
                return;
            }
            out.value(value);
        }
        @Override
        public Integer read(JsonReader in) throws IOException {
            if (in.peek() == JsonToken.NULL) {
                in.nextNull();
                return null;
            }
            return in.nextInt();
        }
    }
    
  • 第三步:注册适配器
    Gson gson = new GsonBuilder()
            .serializeNulls()
            .registerTypeAdapter(Integer.class, new IntegerTypeAdapter())
            .create();
    

注意:如果你的Integer字段是定义为基本数据类型int的话,默认值为0不会触发null序列化逻辑,需要定义为包装类Integer才能生效。

内容的提问来源于stack exchange,提问作者TtT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:06:03