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

Codehaus与Jackson ObjectMapper嵌套对象序列化差异问题

解决Jackson序列化AbstractMap.SimpleEntry与旧版codehaus行为差异问题

问题根源

新版Jackson对AbstractMap.SimpleEntry默认采用Map.Entry的专属序列化逻辑:直接将Entry的key作为JSON对象的键、value作为对应值;而旧版codehaus的ObjectMapper是将其视为普通POJO,序列化出包含key和value两个属性的JSON对象,这就是行为差异的核心原因。

解决方案

方案1:全局注册自定义序列化器

编写专门处理SimpleEntry的序列化器,让Jackson按照旧版逻辑输出:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
import java.util.AbstractMap;

public class SimpleEntrySerializer extends JsonSerializer<AbstractMap.SimpleEntry<String, String>> {
    @Override
    public void serialize(AbstractMap.SimpleEntry<String, String> entry, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("key", entry.getKey());
        gen.writeStringField("value", entry.getValue());
        gen.writeEndObject();
    }
}

然后在ObjectMapper配置中注册该序列化器:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
// 注册自定义序列化器覆盖默认行为
objectMapper.registerModule(new SimpleModule()
        .addSerializer(AbstractMap.SimpleEntry.class, new SimpleEntrySerializer()));

方案2:局部字段注解生效

如果仅需在PostUrl类的params字段上生效,可直接在字段或其getter方法上添加@JsonSerialize注解:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

public class PostUrl {
    private String url;
    
    @JsonSerialize(contentUsing = SimpleEntrySerializer.class)
    private List<AbstractMap.SimpleEntry<String, String>> params = new ArrayList<>();

    // getter、setter方法保持不变
}

为什么@JsonProperty无效?

@JsonProperty仅用于调整字段与JSON键的映射关系,无法改变Jackson对SimpleEntry这类特殊类型的整体序列化逻辑,因此无法解决该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:50:26