我的应用程序正在向外部源发出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
答案 0 :(得分:0)
尝试在Header中设置类似这样的内容类型和字符集&#34; Content-Type&#34;,&#34; application / json; charset = UTF-8&#34;
答案 1 :(得分:0)
你能否从问题中发布更多的堆栈跟踪,是否有任何方法可以预处理外部输入以删除这个有问题的字符?
0xa0不是空格,因此它不会被视为标准空间,这可能会导致问题。如果您可以在使用前预处理数据,只需用空格替换()有问题的字符,这应该可以解决问题
string = string.replace('\u00A0',' ')
另外,请确保使用正确的类型/格式进行数据编码