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

后端 未结 11 1280
南方客
南方客 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:47

    Though this question is already answered, I found another way that requires no special Jackson hooks.

    static class JsonWrapper {
        @JsonUnwrapped
        private T inner;
        private String extraField;
    
        public JsonWrapper(T inner, String field) {
            this.inner = inner;
            this.extraField = field;
        }
    
        public T getInner() {
            return inner;
        }
    
        public String getExtraField() {
            return extraField;
        }
    }
    
    static class BaseClass {
        private String baseField;
    
        public BaseClass(String baseField) {
            this.baseField = baseField;
        }
    
        public String getBaseField() {
            return baseField;
        }
    }
    
    public static void main(String[] args) throws JsonProcessingException {
        Object input = new JsonWrapper<>(new BaseClass("inner"), "outer");
        System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(input));
    }
    

    Outputs:

    {
      "baseField" : "inner",
      "extraField" : "outer"
    }
    

    For writing collections, you can simply use a view:

    public static void main(String[] args) throws JsonProcessingException {
        List inputs = Arrays.asList(new BaseClass("1"), new BaseClass("2"));
        //Google Guava Library <3
        List> modInputs = Lists.transform(inputs, base -> new JsonWrapper<>(base, "hello"));
        System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(modInputs));
    }
    

    Output:

    [ {
      "baseField" : "1",
      "extraField" : "hello"
    }, {
      "baseField" : "2",
      "extraField" : "hello"
    } ]
    

提交回复
热议问题