来自RESTful请求的JSON解析异常

时间:2017-09-27 14:42:44

标签: java json resttemplate

我的应用程序正在向外部源发出RESTful服务请求。外部源返回JSON个数据。但是,我得到了这个例外:

  

“com.fasterxml.jackson.databind.JsonMappingException:无效的UTF-8   开始字节0xa0。“

发出RESTful请求的我的Java代码如下: `

HttpSession httpSession = new HttpSession();
httpSession.createHeaders();
httpSession.setupMessageConverters();
restTemplate.setMessageConverters(httpSession.getMessageConverterList());
ResponseEntity<JsonData> responseEntity = restTemplate.exchange(URLConstants.GET_CUSTOM_EVENTS, HttpMethod.GET, httpSession.getHttpEntity(), JsonData.class);

我有一些代码控制HTTP标头和反序列化设置,如下所示:

public void createHeaders(){
    HttpHeaders httpHeaders = new HttpHeaders(); 
    httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

    HttpEntity<String> httpEntity = new HttpEntity<String>(httpHeaders);
    this.httpEntity = httpEntity;

    this.httpHeaders = httpHeaders;
}      

public void setupMessageConverters(){
    List<HttpMessageConverter<?>> messageConverterList = new ArrayList<>();
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
    messageConverter.setObjectMapper(objectMapper);
    messageConverterList.add(messageConverter);

    this.messageConverterList = messageConverterList;
}

似乎导致错误的JSON行是这样的(如此Web方法的Swagger UI中所示):

{
    "object_id": 5,
    "web_method_rest1": " /rest/information/5",
    "custom_event_type": "save"
}

似乎编码/解码不喜欢JSON数据值中的前导空格。堆栈跟踪显示导致错误为JSON的{​​{1}}变量。有没有办法改变JSON数据的编码方式,以便允许前导空格,例如反序列化设置或我可以添加到HTTP头的东西?由于JSON数据来自外部源,因此我无法轻松控制该数据。

即使有一些我可以指出的文件,我们也会感激您提供的任何帮助。

这是一个更完整的堆栈跟踪:

web_method_rest1

2 个答案:

答案 0 :(得分:0)

尝试在Header中设置类似这样的内容类型和字符集&#34; Content-Type&#34;,&#34; application / json; charset = UTF-8&#34;

答案 1 :(得分:0)

你能否从问题中发布更多的堆栈跟踪,是否有任何方法可以预处理外部输入以删除这个有问题的字符?

0xa0不是空格,因此它不会被视为标准空间,这可能会导致问题。如果您可以在使用前预处理数据,只需用空格替换()有问题的字符,这应该可以解决问题

    string = string.replace('\u00A0',' ')

另外,请确保使用正确的类型/格式进行数据编码