Jax-rs json pretty output

2022-09-03 03:16:54

在Java中,当我使用

@Produces("application/json")

注释输出未格式化为人类可读形式。我该如何做到这一点?


答案 1

只是为了记录,如果您只想为某些资源启用漂亮的输出,则可以在资源方法上使用@JacksonFeatures注释

下面是一个示例:

@Produces(MediaType.APPLICATION_JSON)
@JacksonFeatures(serializationEnable =  { SerializationFeature.INDENT_OUTPUT })
public Bean resource() {
    return new Bean();
}

答案 2

这就是如何根据查询字符串中是否存在“pretty”来正确执行条件漂亮/非漂亮json输出的方法。

创建一个实现 ,它将在每个请求上执行:PrettyFilterContainerResponseFilter

@Provider
public class PrettyFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException {

        UriInfo uriInfo = reqCtx.getUriInfo();
        //log.info("prettyFilter: "+uriInfo.getPath());

        MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
        if(queryParameters.containsKey("pretty")) {
            ObjectWriterInjector.set(new IndentingModifier(true));
        }

    }

    public static class IndentingModifier extends ObjectWriterModifier {

        private final boolean indent;

        public IndentingModifier(boolean indent) {
            this.indent = indent;
        }


        @Override
        public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException {
            if(indent) jsonGenerator.useDefaultPrettyPrinter();
            return objectWriter;
        }
    }
}

差不多就是这样!

您需要确保泽西岛通过自动包裹扫描或手动注册来使用此类。

花了几个小时试图实现这一目标,发现以前没有人发布过即用型解决方案。