This error happens when the (Jackson, this case) JSON engine tries to parse some JSON that is not encoded in UTF-8.

如何告诉引擎它应该期待与UTF-8不同的东西,比如UTF-16?

HttpHeaders requestHeaders = createSomeHeader();
RestTemplate restTemplate = new RestTemplate();
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
String url = "someurl"
ResponseEntity<MyObject[]> arrayResponseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, MyObject[].class);

错误日志(log):

Caused by: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Invalid UTF-8 middle byte 0x20
at [Source: org.apache.http.conn.EofSensorInputStream@44d397b0; line: 92, column: 42]; nested exception is org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0x20
at [Source: org.apache.http.conn.EofSensorInputStream@44d397b0; line: 92, column: 42]
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:138)
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:74)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:622)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:608)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:449)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:404)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:380)
... 4 more
Caused by: org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0x20
at [Source: org.apache.http.conn.EofSensorInputStream@44d397b0; line: 92, column: 42]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1213)
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:375)
at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2132)
at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2139)
at org.codehaus.jackson.impl.Utf8StreamParser._decodeUtf8_3fast(Utf8StreamParser.java:1962)

推荐答案

JSON数据必须编码为UTF-8、UTF-16或UTF-32.JSON解码器可以根据字节流的examining the first four octets确定编码:

       00 00 00 xx  UTF-32BE
       00 xx 00 xx  UTF-16BE
       xx 00 00 00  UTF-32LE
       xx 00 xx 00  UTF-16LE
       xx xx xx xx  UTF-8

It sounds like the server is encoding data in some illegal encoding (ISO-8859-1, windows-1252, etc.)

Json相关问答推荐

使用Jolt库对多个数组进行嵌套循环

在解码的JSON哈希中搜索数组元素

创建Json嵌套文件 struct

在Ansible中从json中提取特定数据

JQ-JSON将键转换为对象

在Ruby的json中压缩单个字段

使用动态语言jQuery:根据匹配模式提取与其他值匹配的值

将JSON行转换为TSV格式, for each 数组项生成单独的行

jq: Select 何时来自另一个数组的值与此 json 中的值匹配

向 JSON 文件添加注释

如何限制resolveJsonModule的范围?

在 JSON API Wordpress 上启用 CORS

Java的JSON字符串整洁/格式化程序

IE8 原生 JSON.parse 错误导致堆栈溢出

规范化 JSON 文件

我应该如何处理 JSON 中的 HATEOAS 链接和引用?

如何向从文件中检索的 JSON 数据添加键值?

在 Android 中使用带有 post 参数的 HttpClient 和 HttpPost

如何在 Python 中合并两个 json 字符串?

如何在spark 上将json字符串转换为数据帧