JSON Неверный средний байт UTF-8 - PullRequest
30 голосов
/ 15 июня 2011

Эта ошибка возникает, когда механизм JSON (в данном случае, Джексон) пытается проанализировать некоторый 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: 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)

Ответы [ 5 ]

29 голосов
/ 15 июня 2011

Данные 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 и т. Д.)

17 голосов
/ 13 апреля 2016

Я получил это исключение, когда в клиентском приложении Java я сериализировал 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

2 голосов
/ 22 декабря 2015

Я получил это после сохранения файла JSON с помощью Notepad2, поэтому мне пришлось открыть его с помощью Notepad ++, а затем сказать «Преобразовать в UTF-8». Тогда это сработало.

0 голосов
/ 15 сентября 2016

По случайности это может помочь другим. Я поделюсь связанным анекдотом.

Я обнаружил эту точную ошибку ( Недопустимый средний байт UTF-8 0x3f ) запуск сценария PowerShell через интегрированную среду сценариев PowerShell (ISE) .Идентичный скрипт, выполненный вне ISE, работает отлично.В коде используются API-интерфейсы REST Confluence v3 и v5.x, и эта ошибка регистрируется на сервере Confluence v5.x - предположительно потому, что ISE каким-то образом сбивает с толку запрос.

0 голосов
/ 07 мая 2014

У меня была эта проблема между разными платформами, так как я получил JSON в качестве String от Mapper и написал сам. Иногда он записывался в файл как ANSI, а иногда - как UTF8. Я перешел на

mapper.writeValue(file, data);

позволил Mapper выполнять файловые операции, и он начал нормально работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...