Search code examples
javajacksonjson-serialization

Specify jackson serialization as an object method


I am looking for a class to implement its own json serialization in a method. I guess it could extend JsonSerializer<Itself>, but that's a little heavy. Is there any other way?

This is what I am looking for.

public class MyClass {

   private int fieldA;
   private String fieldB;

   @JsonSerializer
   public void serialize(JsonGenerator gen, SerializationProvider prov){
     gen.writeField(...)
   }
}

Is there such functionality?


Solution

  • I've adapted the answer. I guess it's closer to what you are looking for?

    import java.io.IOException;
    
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import com.fasterxml.jackson.databind.ser.std.StdSerializer;
    
    @JsonSerialize(using = MyClass2.class)
    class MyClass2 extends StdSerializer<MyClass2> {
        protected int fieldA;
        protected String fieldB;
    
        public MyClass2() {
            super(MyClass2.class);
        }
    
        public void setFieldA(int fieldA) {
            this.fieldA = fieldA;
        }
    
        public void setFieldB(String fieldB) {
            this.fieldB = fieldB;
        }
    
        @Override
        public void serialize(MyClass2 value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartObject();
            gen.writeNumberField("fieldA", value.fieldA);
            gen.writeStringField("fieldB", value.fieldB);
            gen.writeEndObject();
        }
    }
    

    A simple main class to test serialization:

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public class TestAutoSerializer2 {
    
        public TestAutoSerializer2() {
            super();
        }
        
        public void testInnerSerializer2() {
            MyClass2 myClass2 = new MyClass2();
            myClass2.setFieldA(100);
            myClass2.setFieldB("StackOverflow");
    
            String serialized;
            try {
                serialized = new ObjectMapper().writeValueAsString(myClass2);
                System.out.println(getClass().getName()+" serialized to "+serialized);
            } catch (JsonProcessingException e) {
                System.out.println("Cannot serialize");
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            TestAutoSerializer2 tester = new TestAutoSerializer2();
            tester.testInnerSerializer2();
        }
    }