Jackson: How to add custom property to the JSON without modifying the POJO

后端 未结 11 1288
南方客
南方客 2020-11-27 03:10

I am developing a REST interface for my app using Jackson to serialize my POJO domain objects to JSON representation. I want to customize the serialization for some types to

11条回答
  •  爱一瞬间的悲伤
    2020-11-27 03:57

    Since (I think) Jackson 1.7 you can do this with a BeanSerializerModifier and extending BeanSerializerBase. I've tested the example below with Jackson 2.0.4.

    import java.io.IOException;
    
    import org.junit.Test;
    
    import com.fasterxml.jackson.core.JsonGenerationException;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.BeanDescription;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationConfig;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
    import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter;
    import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
    
    
    public class JacksonSerializeWithExtraField {
    
        @Test
        public void testAddExtraField() throws Exception
        {
            ObjectMapper mapper = new ObjectMapper();
    
            mapper.registerModule(new SimpleModule() {
    
                public void setupModule(SetupContext context) {
                    super.setupModule(context);
    
                    context.addBeanSerializerModifier(new BeanSerializerModifier() {
    
                        public JsonSerializer modifySerializer(
                                SerializationConfig config,
                                BeanDescription beanDesc,
                                JsonSerializer serializer) {
                            if (serializer instanceof BeanSerializerBase) { 
                                  return new ExtraFieldSerializer(
                                       (BeanSerializerBase) serializer);
                            } 
                            return serializer; 
    
                        }                   
                    });
                }           
            });
    
            mapper.writeValue(System.out, new MyClass());       
            //prints {"classField":"classFieldValue","extraField":"extraFieldValue"}
        }
    
    
        class MyClass {
    
            private String classField = "classFieldValue";
    
            public String getClassField() { 
                return classField; 
            }
            public void setClassField(String classField) { 
                this.classField = classField; 
            }
        }
    
    
        class ExtraFieldSerializer extends BeanSerializerBase {
    
            ExtraFieldSerializer(BeanSerializerBase source) {
                super(source);
            }
    
            ExtraFieldSerializer(ExtraFieldSerializer source, 
                    ObjectIdWriter objectIdWriter) {
                super(source, objectIdWriter);
            }
    
            ExtraFieldSerializer(ExtraFieldSerializer source, 
                    String[] toIgnore) {
                super(source, toIgnore);
            }
    
            protected BeanSerializerBase withObjectIdWriter(
                    ObjectIdWriter objectIdWriter) {
                return new ExtraFieldSerializer(this, objectIdWriter);
            }
    
            protected BeanSerializerBase withIgnorals(String[] toIgnore) {
                return new ExtraFieldSerializer(this, toIgnore);
            }
    
            public void serialize(Object bean, JsonGenerator jgen,
                    SerializerProvider provider) throws IOException,
                    JsonGenerationException {           
                jgen.writeStartObject();                        
                serializeFields(bean, jgen, provider);
                jgen.writeStringField("extraField", "extraFieldValue"); 
                jgen.writeEndObject();
            }
        }
    }
    

提交回复
热议问题