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
相关产品推荐
相关产品推荐

