Les*_*ood 46 json spring-mvc pretty-print jackson
在使用Spring MVC开发REST服务的同时,我希望在开发中渲染JSON"漂亮打印",但在生产中正常(减少空白).
小智 43
如果您使用的是Spring Boot 1.2或更高版本,那么简单的解决方案就是添加
spring.jackson.serialization.INDENT_OUTPUT=true
Run Code Online (Sandbox Code Playgroud)
到application.properties
文件.这假设您使用Jackson进行序列化.
如果您使用的是早期版本的Spring Boot,则可以添加
http.mappers.json-pretty-print=true
Run Code Online (Sandbox Code Playgroud)
此解决方案仍适用于Spring Boot 1.2,但已弃用,最终将完全删除.您将在启动时在日志中收到弃用警告.
(测试使用spring-boot-starter-web
)
Les*_*ood 31
当我发布这个问题时,我得到了一个答案,但我认为无论如何我都会发布它,以防有更好的替代解决方案.这是我的经历:
首先是第一件事.该MappingJacksonHttpMessageConverter
希望你注入杰克逊ObjectMapper
实例,该实例执行杰克逊的配置(而不是通过Spring类).
我认为这样做会很容易:
创建一个ObjectMapperFactoryBean
允许我自定义ObjectMapper
可以注入的实例的实现MappingJacksonHttpMessageConverter
.例如:
<bean id="jacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper">
<bean class="com.foo.my.ObjectMapperFactoryBean">
<property name="prettyPrint" value="${json.prettyPrint}"/>
</bean>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
然后,在我的ObjectMapperFactoryBean
实现中,我可以做到这一点(正如在SO上的其他地方记录的那样):
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, isPrettyPrint());
return mapper;
Run Code Online (Sandbox Code Playgroud)
但它没有用.并试图弄清楚为什么是一场噩梦.杰克逊出局是对耐心的一次重大考验.查看它的源代码只会让你更加困惑,因为它使用过时和钝的配置形式(用于打开/关闭功能的整数位掩码?你在开玩笑吗?)
我基本上不得不MappingJacksonHttpMessageConverter
从头开始重写Spring ,并将其writeInternal
实现覆盖如下:
@Override
protected void writeInternal(Object o, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
JsonEncoding encoding = getEncoding(outputMessage.getHeaders().getContentType());
JsonGenerator jsonGenerator =
getObjectMapper().getJsonFactory().createJsonGenerator(outputMessage.getBody(), encoding);
try {
if (this.prefixJson) {
jsonGenerator.writeRaw("{} && ");
}
if (isPrettyPrint()) {
jsonGenerator.useDefaultPrettyPrinter();
}
getObjectMapper().writeValue(jsonGenerator, o);
}
catch (JsonGenerationException ex) {
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
}
}
Run Code Online (Sandbox Code Playgroud)
我在现有实现中添加的唯一内容是以下块:
if (isPrettyPrint()) {
jsonGenerator.useDefaultPrettyPrinter();
}
Run Code Online (Sandbox Code Playgroud)
isPrettyPrint()
是一个JavaBeans兼容的getter w /匹配setter,我添加到我的MappingJacksonHttpMessageConverter
子类.
只有在跳过这些箍之后我才能根据我的${json.prettyPrint}
值打开或关闭漂亮的打印(根据应用程序的部署方式设置为属性).
我希望将来可以帮助别人!
Swa*_*ato 24
当您使用Jackson 2.0.0时,您可以按照Les想要的方式进行操作.我目前使用RC3,配置似乎按预期工作.
ObjectMapper jacksonMapper = new ObjectMapper();
jacksonMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
Run Code Online (Sandbox Code Playgroud)
转换
{"foo":"foo","bar":{"field1":"field1","field2":"field2"}}
Run Code Online (Sandbox Code Playgroud)
成
{
"foo" : "foo",
"bar" : {
"field1" : "field1",
"field2" : "field2"
}
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*ttJ 23
可能我建议这种方法,它适用于Spring 4.0.x和可能的旧版本.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper());
return mappingJackson2HttpMessageConverter;
}
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objMapper = new ObjectMapper();
objMapper.enable(SerializationFeature.INDENT_OUTPUT);
return objMapper;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(mappingJackson2HttpMessageConverter());
}
}
Run Code Online (Sandbox Code Playgroud)
感谢Willie Wheeler提供的解决方案:Willie Wheeler的Spring博客
Pro*_*uce 22
如何让杰克逊打印出它生成的JSON内容呢?
这是一个简单的例子:
原始JSON输入:
{"one":"AAA","two":["BBB","CCC"],"three":{"four":"DDD","five":["EEE","FFF"]}}
Run Code Online (Sandbox Code Playgroud)
Foo.java:
import java.io.FileReader;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
public class Foo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
MyClass myObject = mapper.readValue(new FileReader("input.json"), MyClass.class);
// this is Jackson 1.x API only:
ObjectWriter writer = mapper.defaultPrettyPrintingWriter();
// ***IMPORTANT!!!*** for Jackson 2.x use the line below instead of the one above:
// ObjectWriter writer = mapper.writer().withDefaultPrettyPrinter();
System.out.println(writer.writeValueAsString(myObject));
}
}
class MyClass
{
String one;
String[] two;
MyOtherClass three;
public String getOne() {return one;}
void setOne(String one) {this.one = one;}
public String[] getTwo() {return two;}
void setTwo(String[] two) {this.two = two;}
public MyOtherClass getThree() {return three;}
void setThree(MyOtherClass three) {this.three = three;}
}
class MyOtherClass
{
String four;
String[] five;
public String getFour() {return four;}
void setFour(String four) {this.four = four;}
public String[] getFive() {return five;}
void setFive(String[] five) {this.five = five;}
}
Run Code Online (Sandbox Code Playgroud)
输出:
{
"one" : "AAA",
"two" : [ "BBB", "CCC" ],
"three" : {
"four" : "DDD",
"five" : [ "EEE", "FFF" ]
}
}
Run Code Online (Sandbox Code Playgroud)
如果这种方法不能完全满足您的需求,那么如果您在API文档v1.8.1中搜索"漂亮",它将会显示相关的可用组件.如果您使用API版本2.x,那么请查看较新的API 2.1.0文档.
通过添加和配置MappingJackson2HttpMessageConverter转换器将启用Pretty print .在生产环境中禁用prettyprint.
消息转换器配置
<mvc:annotation-driven>
<mvc:message-converters>
<bean id="jacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="prettyPrint" value="${json.prettyPrint}" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38830 次 |
最近记录: |