Jax-rs json相当不错

在Java中我使用的时候

@Produces("application/json") 

注释输出不会形成人类可读的forms。 我怎么做到这一点?

在项目的任何位置创建此类。 它将在部署时加载。 注意.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 它配置映射器以格式化输出。

对于Jackson 2.0及更高版本,用以下代码替换两个.configure()行: .configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false) .configure(SerializationFeature.INDENT_OUTPUT, true);

并相应地更改您的导入。

 package com.secret; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; /** * * @author secret */ @Provider @Produces(MediaType.APPLICATION_JSON) public class JacksonContextResolver implements ContextResolver { private ObjectMapper objectMapper; public JacksonContextResolver() throws Exception { this.objectMapper = new ObjectMapper(); this.objectMapper .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false) .configure(SerializationConfig.Feature.INDENT_OUTPUT, true); } @Override public ObjectMapper getContext(Class objectType) { return objectMapper; } } 

请记住,格式化会对性能产生负面影响。

仅供记录,如果您只想为某些资源启用pretty输出,则可以在资源方法上使用@JacksonFeatures批注 。

这是一个例子:

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

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

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

 @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 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 multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException { if(indent) jsonGenerator.useDefaultPrettyPrinter(); return objectWriter; } } } 

几乎就是这样!

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

花了几个小时试图实现这一目标,发现之前没有人发布过现成的解决方案。

在有用的DaTroop的答案的基础上,这是另一个版本,允许基于缺乏或存在“漂亮”参数在优化的json和格式化的json之间进行选择:

 package test; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; @Provider @Produces(MediaType.APPLICATION_JSON) public class JacksonContextResolver implements ContextResolver { private ObjectMapper prettyPrintObjectMapper; private UriInfo uriInfoContext; public JacksonContextResolver(@Context UriInfo uriInfoContext) throws Exception { this.uriInfoContext = uriInfoContext; this.prettyPrintObjectMapper = new ObjectMapper(); this.prettyPrintObjectMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); } @Override public ObjectMapper getContext(Class objectType) { try { MultivaluedMap queryParameters = uriInfoContext.getQueryParameters(); if(queryParameters.containsKey("pretty")) { return prettyPrintObjectMapper; } } catch(Exception e) { // protect from invalid access to uriInfoContext.getQueryParameters() } return null; // use default mapper } } 

如果您使用的是Spring,那么您可以全局设置该属性

 spring.jackson.serialization.INDENT_OUTPUT=true 

更多信息, 请访问https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html