我认为
@JsonSerialize,
@JsonDeserialize这就是您所需要的。这些注释使您可以控制特定字段的序列化/反序列化。这个问题展示了将它们组合为一个注释的优雅方法。
UPD。
对于这种复杂的情况,您可以看一下
BeanSerializerModifier/BeanDeserializerModifier类。这个想法是
BeanSerializer/BeanDeserializer使用特定字段的自定义逻辑来修改常规,然后让基本实现来做其他事情。稍后再发布示例。
UPD2。 如我所见,一种方法可能是使用
changePropertiesmethod并分配自己的序列化程序。
UPD3。 更新了自定义序列化程序的工作示例。反序列化可以类似的方式进行。
UPD 4。 更新了具有完全自定义序列化/反序列化的示例。(我用过 jakson-mapper-asl-1.9.8 )
public class TestBeanSerializationModifiers { static final String PropertyName = "customProperty"; static final String CustomValue = "customValue"; static final String basevalue = "basevalue"; // Custom serialization static class CustomSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { String customValue = CustomValue; // someService.getCustomValue(value); jgen.writeString(customValue); } } static class MyBeanSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BasicBeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (int i = 0; i < beanProperties.size(); i++) { BeanPropertyWriter beanPropertyWriter = beanProperties.get(i); if (PropertyName.equals(beanPropertyWriter.getName())) { beanProperties.set(i, beanPropertyWriter.withSerializer(new CustomSerializer())); } } return beanProperties; } } // Custom deserialization static class CustomDeserializer extends JsonDeserializer<Object> { @Override public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { // serialized value, 'customValue' String serializedValue = jp.getText(); String basevalue = basevalue; // someService.restoreOldValue(serializedValue); return basevalue; } } static class MyBeanDeserializerModifier extends BeanDeserializerModifier { @Override public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BasicBeanDescription beanDesc, BeanDeserializerBuilder builder) { Iterator<SettableBeanProperty> beanPropertyIterator = builder.getProperties(); while (beanPropertyIterator.hasNext()) { SettableBeanProperty settableBeanProperty = beanPropertyIterator.next(); if (PropertyName.equals(settableBeanProperty.getName())) { SettableBeanProperty newSettableBeanProperty = settableBeanProperty.withValueDeserializer(new CustomDeserializer()); builder.addOrReplaceProperty(newSettableBeanProperty, true); break; } } return builder; } } static class Model { private String customProperty = basevalue; private String[] someArray = new String[]{"one", "two"}; public String getCustomProperty() { return customProperty; } public void setCustomProperty(String customProperty) { this.customProperty = customProperty; } public String[] getSomeArray() { return someArray; } public void setSomeArray(String[] someArray) { this.someArray = someArray; } } public static void main(String[] args) { SerializerFactory serializerFactory = BeanSerializerFactory .instance .withSerializerModifier(new MyBeanSerializerModifier()); DeserializerFactory deserializerFactory = BeanDeserializerFactory .instance .withDeserializerModifier(new MyBeanDeserializerModifier()); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializerFactory(serializerFactory); objectMapper.setDeserializerProvider(new StdDeserializerProvider(deserializerFactory)); try { final String fileName = "test-serialization.json"; // Store, "customValue" -> json objectMapper.writevalue(new File(fileName), new Model()); // Restore, "basevalue" -> model Model model = objectMapper.readValue(new File(fileName), Model.class); } catch (IOException e) { e.printStackTrace(); } }}


