Serialize one class in two different ways with Jackson

后端 未结 2 1821
滥情空心
滥情空心 2020-12-18 01:25

In one of our projects we use a java webapp talking to a MongoDB instance. In the database, we use DBRefs to keep track of some object relations. We (de)seriali

相关标签:
2条回答
  • 2020-12-18 02:12

    Use a custom JSONSerializer and apply your logic in the serialize method:

    public static class FooReference {
        public DBRef<Foo> foo;
    
        @JsonSerialize(using = CustomSerializer.class)
        public Foo getFoo() {
            return foo.fetch();
        }
    }
    
    public class CustomSerializer extends JsonSerializer<Object> {
       public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
           throws IOException, JsonProcessingException {
         // jgen.writeObjectField ...
       }
    }
    
    0 讨论(0)
  • 2020-12-18 02:21

    From looking at options, it seems you can annotate properties to only be shown if a given View is passed to the ObjectMapper used for serialization. You could thus edit the class:

    public static class FooReference {
        public DBRef<Foo> foo;
    
        @JsonView(Views.WebView.class)
        public Foo getFoo() {
            return foo.fetch();
        }
    }
    

    and provide:

    class Views {
        static class WebView { }
    }
    

    and then serialize after creating a configuration with the correct view:

    SerializationConfig conf = objectMapper.getSerializationConfig().withView(Views.WebView.class);
    objectMapper.setSerializationConfig(conf);
    

    Which would then serialize it. Not specifying the view when serializing with the MongoDB wrapper would mean the method would be ignored. Properties without a JsonView annotation are serialized by default, a behaviour you can change by specifying:

    objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);
    

    More info is available on the Jackson Wiki.

    There are still other alternatives, too, it turns out: there are Jackson MixIns which would let you override (de)serialization behaviour of parts of a class without modifying the class itself, and as of Jackson 2.0 (very recent release) there are filters, too.

    0 讨论(0)
提交回复
热议问题