如何防止杰克逊输出漂亮的打印JSON?
我想确保杰克逊生成的JSON文件永远不会很漂亮。我是一名初级项目的初级工程师,所以我需要向后工作以找出JSON可以配置为输出为漂亮打印的所有方式。我可以确认在项目中有0个对.defaultPrettyPrintingWriter()的引用,还有0个对.setSerializationConfig的引用,我相信它们也可以用来启用漂亮的打印。如何防止杰克逊输出漂亮的打印JSON?
那么这又怎么可能呢?或者,有没有一种确保JSON文件打印效果不错的方法?
根据您使用的Spring的版本,MappingJacksonHttpMessageConverter
应该有一个名为prettyPrint
的布尔属性来在序列化JSON时配置打印机。
所以这个XML配置应该做的伎俩(如果你使用的是最近的弹簧3版)
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
<property name="objectMapper" ref="jacksonObjectMapper" />
<property name="prettyPrint" value="false" />
</bean>
你可以看到在github上引入属性的related commit。和类的trunk version也包括这个属性。最后,这是与之前提交相关的Spring Jira问题SPR-7201。
或者你可以尝试更新您的杰克逊的版本,以更近的一个包含useDefaultPrettyPrinter
和setPrettyPrinter
方法由亚历山大Ryzhov提到
不确定您使用的是哪个版本的Jackson,但在最新版本(1.9.10)中,JsonGenerator的默认行为没有漂亮的打印效果。打开它的最简单方法是致电generator.useDefaultPrettyPrinter()
或generator.setPrettyPrinter(new DefaultPrettyPrinter())
。尝试搜索useDefaultPrettyPrinter
和setPrettyPrinter
并删除这些语句。
该项目使用的版本是1.3。我在项目中搜索useDefaultPrettyPrinter和setPrettyPrinter,无济于事 – tamuren 2012-10-25 13:04:37
最优雅的解决方案是把开关漂亮的/不漂亮过滤器,并重新使用静态配置对象。这可以防止无用的垃圾收集。
/**
* Evaluate the "pretty" query parameter. If given without any value, or with "true": pretty JSON output.
* E.g. /test?pretty or /test?pretty=true
* Otherwise output without any formatting.
*
* @see https://*.com/questions/10532217/jax-rs-json-pretty-output
*/
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class RestPrettyJsonFilter implements ContainerResponseFilter {
public static final String QUERYPARAM_PRETTY = "pretty";
private static final IndentingModifier INDENTING_MODIFIER_PRETTY = new IndentingModifier(true);
private static final IndentingModifier INDENTING_MODIFIER_NOT_PRETTY = new IndentingModifier(false);
@Override
public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException {
boolean pretty = false;
UriInfo uriInfo = reqCtx.getUriInfo();
//log.info("prettyFilter: "+uriInfo.getPath());
MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
if(queryParameters.containsKey(QUERYPARAM_PRETTY)) {
// Pretty query parameter is present
String prettyParam = queryParameters.getFirst(QUERYPARAM_PRETTY);
// Pretty is present without any value, or value is set to "true"?
if (prettyParam == null || "".equals(prettyParam) || "true".equals(prettyParam)) {
pretty = true;
}
}
// Prevent recreation of objects over and over again
//ObjectWriterInjector.set(new IndentingModifier(pretty));
if (pretty) {
ObjectWriterInjector.set(INDENTING_MODIFIER_PRETTY);
} else {
ObjectWriterInjector.set(INDENTING_MODIFIER_NOT_PRETTY);
}
}
/**
* Used to switch on/off pretty output for each response.
*/
public static class IndentingModifier extends ObjectWriterModifier {
private final boolean indent;
/** Minimal pretty printer is not printing pretty. */
private final static PrettyPrinter NOT_PRETTY_PRINTER = new com.fasterxml.jackson.core.util.MinimalPrettyPrinter();
public IndentingModifier(boolean indent) {
this.indent = indent;
}
/* (non-Javadoc)
* @see com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier#modify(com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase, javax.ws.rs.core.MultivaluedMap, java.lang.Object, com.fasterxml.jackson.databind.ObjectWriter, com.fasterxml.jackson.core.JsonGenerator)
*/
@Override
public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException {
if(indent) {
// Pretty
jsonGenerator.useDefaultPrettyPrinter();
} else {
// Not pretty
jsonGenerator.setPrettyPrinter(NOT_PRETTY_PRINTER);
}
return objectWriter;
}
}
}
您是否在使用任何bean或应用程序服务器?你可能想在配置文件中检查'prettyPrint'属性。 – 2012-08-07 18:47:19
更新:我在我正在开发的项目中发现了ObjectMapper的几个实例。如果我写了类似 OutputMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT,false); 然后我会得到我要找的非漂亮的打印JSON,对吧? – tamuren 2012-08-07 18:47:39
*“OutputMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT,false);然后我会得到我要找的非漂亮的打印JSON,对吧?”**理论上,是的,应该使ObjectMapper的该实例不漂亮的印刷品。尽管如此,仍然可以通过其他方式创建ObjectMapper。 – 2012-08-07 18:50:37