How to return a partial JSON response using Java?

后端 未结 3 709
孤街浪徒
孤街浪徒 2020-11-30 23:51

I\'m building a RESTful API and want to provide developers with the option to choose which fields to return in the JSON response. This blog post shows examples of how sever

3条回答
  •  情书的邮戳
    2020-12-01 00:12

    Creating an ObjectMapper instance inside the resource method for every request can have significant performance overhead. According to the Jackson performance best practices object mappers are expensive to create.

    Instead you can customize the JAX-RS provider's Jackson object writer inside the resource method using the Jackson 2.3 ObjectWriterModifier/ObjectReaderModifier feature.

    Here is an example shows how to register an ObjectWriterModifier thread local object that changes the set of the filters applied for the JAX-RS Jackson provider being used inside a resource method. Note that I have not tested the code against an JAX-RS implementation.

    public class JacksonObjectWriterModifier2 {
    
        private static class FilterModifier extends ObjectWriterModifier {
            private final FilterProvider provider;
    
            private FilterModifier(FilterProvider provider) {
                this.provider = provider;
            }
    
            @Override
            public ObjectWriter modify(EndpointConfigBase endpoint, MultivaluedMap responseHeaders,
                                       Object valueToWrite, ObjectWriter w, JsonGenerator g) throws IOException {
                return w.with(provider);
            }
        }
    
        @JsonFilter("filter1")
        public static class Bean {
            public final String field1;
            public final String field2;
    
            public Bean(String field1, String field2) {
                this.field1 = field1;
                this.field2 = field2;
            }
        }
    
        public static void main(String[] args) throws IOException {
            Bean b = new Bean("a", "b");
            JacksonJsonProvider provider = new JacksonJsonProvider();
            ObjectWriterInjector.set(new FilterModifier(new SimpleFilterProvider().addFilter("filter1",
                    SimpleBeanPropertyFilter.filterOutAllExcept("field1"))));
    
            provider.writeTo(b, Bean.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, System.out);
        }
    
    }
    

    Output:

    {"field1":"a"}
    

提交回复
热议问题