Jackson JsonParseException: недопустимый средний байт UTF-8
Эта ошибка возникает, когда движок Jackson пытается проанализировать ответ json с сервера.
Я использую Spring Android для сериализации/десериализации объектов в json и из него.
Эта проблема, похоже, связана с кодировкой 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);
журнал ошибок:
Caused by: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Invalid UTF-8 middle byte 0x20
at [Source: [email protected]; line: 92, column: 42]; nested exception is org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0x20
at [Source: [email protected]; 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: [email protected]; 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)
Ответы
Ответ 1
Данные JSON должны быть закодированы как UTF-8, UTF-16 или UTF-32. Декодер JSON может определить кодировку для проверки первых четырех октетов байтового потока:
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
Похоже, что сервер кодирует данные в некорректном кодировании (ISO-8859-1, windows-1252 и т.д.).
Ответ 2
Я получил это исключение, когда в приложении Java Client я сериализовал JSON, как этот
String json = mapper.writeValueAsString(contentBean);
а на стороне сервера я использовал Spring Boot в качестве конечной точки REST.
Исключение:
Вложенное исключение - com.fasterxml.jackson.databind.JsonMappingException: недопустимый стартовый байт UTF-8 0xaa
Моя проблема заключалась в том, что я не устанавливал правильную кодировку в HTTP-клиенте.
Это решило мою проблему:
updateRequest.setHeader("Content-Type", "application/json;charset=UTF-8");
StringEntity entity= new StringEntity(json, "UTF-8");
updateRequest.setEntity(entity);
Android установить тип контента HttpPost
Ответ 3
Я получил это после сохранения файла JSON с помощью Notepad2, поэтому мне пришлось открыть его с помощью Notepad ++, а затем сказать "Преобразовать в UTF-8". Тогда это сработало.
Ответ 4
У меня была эта проблема непоследовательно между разными платформами, поскольку я получил JSON как String от Mapper и сам написал. Иногда он попадал в файл как ansi и другие времена правильно, как UTF8. Я переключился на
mapper.writeValue(file, data);
позволяет Mapper выполнять операции с файлами, и он начал работать нормально.
Ответ 5
В случае случайности это может помочь другим, я поделюсь связанным анекдотом.
Я столкнулся с этой точной ошибкой (Недопустимый средний байт UTF-8 0x3f), который запускает PowerShell script через среду PowerShell Интегрированная script (ISE). Точный script, выполненный вне ISE, отлично работает. В коде используются API-интерфейсы Confluence v3 и v5.x REST, и эта ошибка регистрируется на сервере Confluence v5.x - предположительно потому, что ISE каким-то образом склеивается с запросом.