JSON Vínculo inválido UTF-8 medio

Este error ocurre cuando el motor JSON (Jackson, este caso) intenta analizar un JSON que no está codificado en UTF-8.

¿Cómo decirle al motor que debería esperar algo diferente de UTF-8, como UTF-16?

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

registro de errores:

 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) 

Los datos JSON deben estar codificados como UTF-8, UTF-16 o UTF-32. El decodificador JSON puede determinar la encoding examinando los primeros cuatro octetos de la secuencia de bytes:

  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 

Parece que el servidor está codificando datos en alguna encoding ilegal (ISO-8859-1, Windows-1252, etc.)

Obtuve esta excepción cuando en la aplicación de cliente Java estaba serializando un JSON como este

 String json = mapper.writeValueAsString(contentBean); 

y en el lado del servidor estaba usando Spring Boot como REST Endpoint. La excepción fue:

la excepción anidada es com.fasterxml.jackson.databind.JsonMappingException: UTF-8 no válido start byte 0xaa

Mi problema era que no estaba configurando la encoding correcta en el cliente HTTP. Esto resolvió mi problema:

 updateRequest.setHeader("Content-Type", "application/json;charset=UTF-8"); StringEntity entity= new StringEntity(json, "UTF-8"); updateRequest.setEntity(entity); 

Android establece el tipo de contenido HttpPost

Lo obtuve después de guardar el archivo JSON usando Notepad2, así que tuve que abrirlo con Notepad ++ y luego decir “Convertir a UTF-8”. Entonces funcionó.

Tuve este problema de forma incoherente entre diferentes plataformas, ya que obtuve JSON como cadena de Mapper e hice la escritura yo mismo. A veces entró en el archivo como ansi y otras veces correctamente como UTF8. Cambié a

 mapper.writeValue(file, data); 

dejando que Mapper haga las operaciones del archivo, y comenzó a funcionar bien.

Por si acaso, puede ayudar a otros a compartir una anécdota relacionada.

Encontré este error exacto ( Byte medio inválido UTF-8 0x3f ) ejecutando un script de PowerShell a través del Entorno de script integrado (ISE) de PowerShell. El script idéntico, ejecutado fuera del ISE, funciona bien. El código utiliza las API REST de Confluence v3 y v5.x, y este error se registra en el servidor Confluence v5.x, presumiblemente porque el ISE de alguna manera se entromete con la solicitud.