Java如何在JSON中表示空Integer 空值时保留属性名而非省略
实现方案
完全可以实现,核心需要两步操作:首先开启JSON序列化框架的空值字段输出配置(默认一般是关闭的,所以null值字段会被省略),其次自定义Integer类型的null值序列化规则,匹配你要的输出格式。
以下是国内常用的3种JSON序列化框架的具体实现方式:
1. Jackson(SpringBoot默认序列化框架)
- 第一步:开启全局null字段输出
配置ObjectMapper:
SpringBoot项目也可以直接在配置文件中添加:ObjectMapper objectMapper = new ObjectMapper(); // 序列化时保留所有字段,包括null值 objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);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
相关产品推荐
相关产品推荐

