web-dev-qa-db-fra.com

JSON Octet du milieu UTF-8 non valide

Cette erreur se produit lorsque le moteur JSON (Jackson, dans ce cas) essaie d'analyser du JSON qui n'est pas codé en UTF-8.

Comment dire au moteur qu'il doit s'attendre à quelque chose de différent de l'UTF-8, comme l'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);

journal des erreurs:

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)
30
virtual82

Les données JSON doivent être codées en UTF-8, UTF-16 ou UTF-32. Le décodeur JSON peut déterminer l'encodage par en examinant les quatre premiers octets du flux d'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

Il semble que le serveur encode des données dans un encodage illégal (ISO-8859-1, windows-1252, etc.)

29
McDowell

J'ai eu cette exception lorsque dans l'application cliente Java Java, je sérialisais un JSON comme celui-ci

String json = mapper.writeValueAsString(contentBean);

et côté serveur, j'utilisais Spring Boot comme REST Endpoint. L'exception était:

L'exception imbriquée est com.fasterxml.jackson.databind.JsonMappingException: octet de démarrage UTF-8 non valide 0xaa

Mon problème était que je ne définissais pas l'encodage correct sur le client HTTP. Cela a résolu mon problème:

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

Android définit le type de contenu HttpPost

17
razvang

Je l'ai obtenu après avoir enregistré le fichier JSON à l'aide de Notepad2, j'ai donc dû l'ouvrir avec Notepad ++ et dire ensuite "Convertir en UTF-8". Ensuite, cela a fonctionné.

3
EpicPandaForce

J'ai eu ce problème de manière incohérente entre les différentes plates-formes, car j'ai obtenu JSON en tant que chaîne de Mapper et j'ai écrit moi-même. Parfois, il est entré dans le fichier en tant qu'ansi et d'autres fois correctement en UTF8. Je suis passé à

mapper.writeValue(file, data);

laisser Mapper effectuer les opérations sur les fichiers, et cela a commencé à fonctionner correctement.

0
user3610939

Au cas où cela pourrait aider les autres, je partagerai une anecdote connexe.

J'ai rencontré cette erreur exacte ( Octet du milieu UTF-8 non valide 0x3f ) lors de l'exécution d'un script PowerShell via PowerShell Environnement de script intégré (ISE). Le script identique, exécuté en dehors de l'ISE, fonctionne très bien. Le code utilise les API Confluence v3 et v5.x REST et cette erreur est enregistrée sur le serveur Confluence v5.x - probablement parce que l'ISE déblaie d'une manière ou d'une autre avec la demande.

0
ScottWelker