Java Jackson对象映射器在响应中包含转义序列
当我使用对象映射器时,它会在响应中引入\r\n。请帮助我如何解决它。 我有一个trainpojo,它有字符串名和字符串值。 我将名称设置为“Sydney”,值设置为“SYD”。它会重新运行Java Jackson对象映射器在响应中包含转义序列,java,json,spring,jackson,Java,Json,Spring,Jackson,当我使用对象映射器时,它会在响应中引入\r\n。请帮助我如何解决它。 我有一个trainpojo,它有字符串名和字符串值。 我将名称设置为“Sydney”,值设置为“SYD”。它会重新运行 {\ \ \"name \" : \"Sydney\",\ \ \"Value \" : \"SYD\",\ \ \"isEnable\" : false,\ \ \"isCurrent\" : false\ \ }" 浏览器中的原始值 "{\r\n \"name\" : \"Sydney\",\r\n
{\ \ \"name \" : \"Sydney\",\ \ \"Value \" : \"SYD\",\ \ \"isEnable\" : false,\ \ \"isCurrent\" : false\ \ }"
浏览器中的原始值
"{\r\n \"name\" : \"Sydney\",\r\n \"name\" : \"SYD\",\r\n \"isEnable\" : false,\r\n \"isCurrent\" : false\r\n}"
下面是我的代码
训练
控制器校准
public ResponseEntity<String> getDetails( )
throws IOException {
ResponseEntity<String> responseEntity = null;
try(StringWriter writer = new StringWriter()) {
ObjectMapper mapper = new ObjectMapper();
Train train = new Train();
// set name and value to the train object//
if(train != null)
{
mapper.setSerializationInclusion(Inclusion.NON_NULL);
mapper.setSerializationInclusion(Inclusion.NON_EMPTY);
mapper.writerWithDefaultPrettyPrinter().writeValue(writer,
train);
responseEntity = new ResponseEntity<>(writer.toString(),
HttpStatus.OK);
}
}
catch()
{}
return responseEntity;
}
public ResponseEntity getDetails()
抛出IOException{
ResponseEntity ResponseEntity=null;
尝试(StringWriter=新建StringWriter()){
ObjectMapper mapper=新的ObjectMapper();
列车=新列车();
//设置列车对象的名称和值//
如果(列车!=null)
{
mapper.setSerializationInclusion(Inclusion.NON_NULL);
mapper.setSerializationInclusion(Inclusion.NON_EMPTY);
mapper.writerWithDefaultPrettyPrinter().writeValue(writer,
列车);
responseEntity=新的responseEntity(writer.toString(),
HttpStatus.OK);
}
}
捕获()
{}
返回响应性;
}
配置:
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
converters.add(extendedJsonConvertor());
super.configureMessageConverters(converters);
}
@Bean
public MappingJackson2HttpMessageConverter extendedJsonConvertor() {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter
.setObjectMapper(getNullAndEmptyFilteredObjectMapper());
return mappingJackson2HttpMessageConverter;
}
@Bean
public ObjectMapper getNullAndEmptyFilteredObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
objectMapper.configure(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
@覆盖
公共无效配置MessageConverters(
列表问题在下面一行
mapper.writerWithDefaultPrettyPrinter().writeValue(writer,train);
尝试将其替换为
mapper.writeValue(writer,train);
为什么在配置MappingJackson2HttpMessageConverter时要创建新的对象映射器?
您可以自动连接对象映射器或返回实际对象,并让spring将其转换为json,我认为这是一个“简单”的双重编码问题。您可以在响应实体中设置一个字符串,该字符串再次作为json响应写入
如果您希望依赖spring视图渲染(mappingjackson2httpmessageconverter),则必须为“Train”创建响应实体(或直接从控制器方法返回Train实例)
或者您使用您实现它的方式,并且您必须确保为json响应呈现字符串不会使用jackson消息转换器,而是spring不会触及它。您使用的是spring mvc吗?是的,Haim。我也在配置文件中添加了configureMessageConverters,但相同的响应今天这个问题有6024个视图,我认为nk它应该得到很好的公认答案确保您使用的是MappingJackson2HttpMessageConverter。您的spring版本是什么确保您实际使用的是此代码(放置一个断点)。可能它在某个地方被重写。请尝试强制禁用映射器。禁用(SerializationFeature.INDENT\u输出);@Hamin我在配置类中定义了映射器,但我正在通过ObjectMapper mapper=new ObjectMapper()创建映射器的实例;是否会导致此问题我尝试自动连接对象映射器,但返回上下文初始化失败。因为我正在配置类中的配置消息转换器中调用这些对象映射器,所以我无法自动连接映射器。
mapper.writeValue(writer,train);