【问题标题】:Jackson object mapper includes escape sequence in responsesJackson 对象映射器在响应中包含转义序列
【发布时间】:2015-01-25 07:57:22
【问题描述】:

当我使用对象映射器时,它会在响应中包含 \r\n。帮助我如何解决它。 我有火车 POJO,它有字符串名称和字符串值。 我将名称设置为“悉尼”,将值设置为“SYD”。它重新运行

{\ \ \"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 class Train {

    public Train() {
    }


    private String name;
    private String value; 
    private String Code;
    private String countryName;
    private String state;
    private String stateName;
    private boolean isEnable;
    private boolean isCurrent;

    //*getters and setters/*/
    }

控制器类

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;
             }

配置:

@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;
    }

当我调试上面的代码时,我开始知道映射器在响应中包含那些 \r\n。帮助我如何删除这些斜杠。

【问题讨论】:

  • 你在用spring-mvc吗?
  • 是的 Haim 。我也在配置文件中添加了 configureMessageConverters 但同样的响应
  • 今天这个问题有 6024 次浏览,我认为它应该得到很好的接受的答案

标签: java json spring jackson


【解决方案1】:

问题出在下面一行。

mapper.writerWithDefaultPrettyPrinter().writeValue(writer,train);  

尝试替换为

mapper.writeValue(writer,train);

为什么在配置的时候要新建一个对象映射器,MappingJackson2HttpMessageConverter?
您可以自动装配对象映射器或返回实际对象并让 spring 将其转换为 json

【讨论】:

  • 确保您使用的是 MappingJackson2HttpMessageConverter。你的春季版本是什么
  • 确保您确实在使用此代码(放置断点)。也许它在某个地方是压倒一切的。尝试强制禁用 mapper.disable(SerializationFeature.INDENT_OUTPUT);
  • @Hamin 我在配置类中定义了映射器,但我正在通过 ObjectMapper mapper = new ObjectMapper(); 创建映射器实例.会解决这个问题吗
  • 我尝试自动装配对象映射器,但它返回上下文初始化失败。bcas 我在配置类的配置消息转换器中调用那些对象映射器,所以我无法自动装配映射器
【解决方案2】:

我相信这是一个“简单”的双重编码问题。您在响应实体中设置了一个字符串,该字符串再次被写为 json 响应。

如果你想依赖 spring 视图渲染(mappingjackson2httpmessageconverter)你必须为“Train”创建一个响应实体。 (或者直接从你的控制器方法返回一个火车实例)

或者您使用您实现它的方式,并且您必须确保为 json 响应呈现字符串不会使用杰克逊消息转换器,而是不受 spring 影响。

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2019-09-24
    • 2014-09-18
    • 2011-06-28
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多