51 votes

JSON Octet médian invalide UTF-8

Cette erreur se produit lorsque le moteur JSON (Jackson, dans ce cas) tente de parser un JSON qui n'est pas encodé en UTF-8.

Comment indiquer 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(requestHeaders);
String url = "someurl"
ResponseEntity arrayResponseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, MyObject[].class);

journal des erreurs :

Caused by: org.springframework.http.converter.HttpMessageNotReadableException: Impossible de lire JSON : Octet intermédiaire 0x20 invalide en UTF-8
à [Source: org.apache.http.conn.EofSensorInputStream@44d397b0; ligne: 92, colonne: 42]; exception imbriquée org.codehaus.jackson.JsonParseException: Octet intermédiaire 0x20 invalide en UTF-8
à [Source: org.apache.http.conn.EofSensorInputStream@44d397b0; ligne: 92, colonne: 42]
à org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:138)
à org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154)
à org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:74)
à org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:622)
à org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:608)
à org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:449)
à org.springframework.web.client.RestTemplate.execute(RestTemplate.java:404)
à org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:380)
... 4 more
Caused by: org.codehaus.jackson.JsonParseException: Octet intermédiaire 0x20 invalide en UTF-8
à [Source: org.apache.http.conn.EofSensorInputStream@44d397b0; ligne: 92, colonne: 42]
à org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1213)
à org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:375)
à org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2132)
à org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.java:2139)
à org.codehaus.jackson.impl.Utf8StreamParser._decodeUtf8_3fast(Utf8StreamParser.java:1962)

44voto

razvang Points 736

J'ai obtenu cette exception lorsque dans l'application cliente Java j'ai sérialisé un JSON de cette manière

String json = mapper.writeValueAsString(contentBean);

et du côté du serveur j'utilisais Spring Boot comme point de terminaison REST. 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 correctement l'encodage 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);

Définir le type de contenu Android HttpPost

38voto

McDowell Points 62645

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

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

2 votes

Et pour ce que ça vaut, c'est précisément ce que Jackson fait -- le défi est simplement que ISO-8859-x ressemble à UTF-8 dans ce sens. Mais comme les encodages non unicode ne sont pas autorisés avec Unicode, ce n'est pas un problème avec un JSON valide.

3 votes

Dans mon cas, cela était causé par l'utilisation de content.toString().getBytes() pour FileObjectStream#write() (où content est un JsonNode) lorsque j'ai créé le fichier - cela semble la même chose, mais ce n'est pas le cas! La solution consiste à utiliser new ObjectMapper().writeValueAsBytes(content). Après avoir réalisé cela, je l'ajoute ici en tant que commentaire au cas où quelqu'un d'autre se retrouverait dans la même situation que moi et que cela les aide

5voto

Zhuinden Points 3074

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

3voto

ScottWelker Points 156

En cas de besoin, je partagerai une anecdote connexe.

J'ai rencontré cette erreur exacte (Byte du milieu invalide UTF-8 0x3f) en exécutant un script PowerShell via l'Environnement de Script Intégré (ISE) de PowerShell. Le même script, exécuté à l'extérieur de l'ISE, fonctionne correctement. Le code utilise les API REST de Confluence v3 et v5.x et cette erreur est enregistrée sur le serveur Confluence v5.x - vraisemblablement parce que l'ISE altère d'une manière ou d'une autre la requête.

2voto

Rogerio Souza Points 99

Cette réponse a résolu mon problème. Voici une copie de celle-ci :

Assurez-vous de démarrer votre JVM avec -Dfile.encoding=UTF-8. Votre JVM se base par défaut sur le jeu de caractères du système d'exploitation

Ceci est un argument JVM qui pourrait être ajouté, par exemple, soit à JBoss en mode autonome ou à JBoss en étant exécuté depuis Eclipse.

Dans mon cas, ce problème est apparu isolément sur l'ordinateur d'une seule personne de mon équipe. Tous les autres fonctionnaient sans ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X