Подтвердить что ты не робот

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)
4b9b3361

Ответ 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 каким-то образом склеивается с запросом.