How to pass constructor's parameters with jackson?

后端 未结 2 500
眼角桃花
眼角桃花 2020-12-20 00:54

i am trying to desearlize an object using Jackson

this.prepareCustomMapper().readValue(response.getBody(), EmailResponse.class);

and i have

2条回答
  •  借酒劲吻你
    2020-12-20 01:27

    You can use the Jackson value injection feature to pass an object reference which is not a part of the input JSON as a constructor parameter. Here is an example:

    public class JacksonInjectExample {
        private static final String JSON = "{\"field1\":\"value1\", \"field2\":123}";
    
        // HttpResponse in your case
        public static class ExternalObject {
            @Override
            public String toString() {
                return "MyExternalObject";
            }
        }
    
        public static class Bean {
            // make fields public to avoid writing getters in this example
            public String field1;
            public int field2;
    
            private ExternalObject external;
    
            public Bean(@JacksonInject final ExternalObject external) {
                this.external = external;
            }
    
            @Override
            public String toString() {
                return "Bean{" +
                        "field1='" + field1 + '\'' +
                        ", field2=" + field2 +
                        ", external=" + external +
                        '}';
            }
        }
    
        public static void main(String[] args) throws IOException {
            final ObjectMapper mapper = new ObjectMapper();
            final InjectableValues.Std injectableValues = new InjectableValues.Std();
            injectableValues.addValue(ExternalObject.class, new ExternalObject());
            mapper.setInjectableValues(injectableValues);
    
            final Bean bean = mapper.readValue(JSON, Bean.class);
            System.out.println(bean);
        }
    }
    

    Output:

    Bean{field1='value1', field2=123, external=MyExternalObject}
    

提交回复
热议问题