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)

1voto

user3610939 Points 11

J'ai rencontré ce problème de manière inconsistante entre différentes plateformes, car je recevais du JSON sous forme de chaîne de caractères depuis le Mapper et je faisais moi-même l'écriture. Parfois, il était enregistré dans le fichier en tant qu'ANSI et d'autres fois correctement en tant qu'UTF-8. J'ai donc changé pour

mapper.writeValue(file, data);

en laissant le Mapper gérer les opérations sur le fichier, et cela a commencé à fonctionner correctement.

0voto

passedbylove Points 1

Protocole texte client

POST http://127.0.0.1/bom/create HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.25.0
Accept: */*
Postman-Token: 50ecfbfe-741f-4a2b-a3d3-cdf162ada27f
Host: 127.0.0.1
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 405

{
  "fwoid": 1,
  "list": [
    {
      "bomIndex": "10001",
      "desc": "带GH 1.25 13pin 公座带针 白色",
      "pn": "084.0001.0036",
      "preUse": 1,
      "type": "追觅 除螨仪-开关PCB组件"
    },
     {
      "bomIndex": "10002",
      "desc": "紫米音箱-商品码标签",
      "pn": "Z.08.013.0051",
      "preUse": 1,
      "type": "E060A0302301"
    }
  ]
}
HTTP/1.1 200 OK
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Date: Mon, 01 Jun 2020 11:23:42 GMT
Content-Length: 40

{"code":"0","message":"BOM保存成功"}

un code Contrôleur springboot :

@PostMapping("/bom/create")
@ApiOperation(value = "Enregistrer le BOM")
@BusinessOperation(module = "BOM",methods = "Analyser le BOM")
public JsonResult save(@RequestBody BOMSaveQuery query)
{
    return bomService.saveBomList(query);
}

lorsque je débogue sur l'interface de boucle locale, tout fonctionne bien. alors que quand je déploie sur le serveur internet via une commande bat, j'ai une erreur

ServletInvocableHandlerMethod - Impossible de résoudre le paramètre [0] dans public XXXController.save(com.h2.mes.query.BOMSaveQuery): erreur d'analyse JSON : Octet UTF-8 intermédiaire non valide 0x3f ; exception imbriquée com.fasterxml.jackson.databind.JsonMappingException: Octet UTF-8 intermédiaire non valide 0x3f
 à [Source: (PushbackInputStream); ligne: 9, colonne: 32] (à travers la chaîne de référence: com.h2.mes.query.BOMSaveQuery["list"]->java.util.ArrayList[0]->com.h2.mes.vo.BOMVO["type"])
2020-06-01 15:37:50.251 MES [XNIO-1 task-13] AVERTISSEMENT  o.s.w.s.m.s.DefaultHandlerExceptionResolver - Résolu [org.springframework.http.converter.HttpMessageNotReadableException: erreur d'analyse JSON : Octet UTF-8 intermédiaire non valide 0x3f ; exception imbriquée com.fasterxml.jackson.databind.JsonMappingException: Octet UTF-8 intermédiaire non valide 0x3f
 à [Source: (PushbackInputStream); ligne: 9, colonne: 32] (à travers la chaîne de référence: com.h2.mes.query.BOMSaveQuery["list"]->java.util.ArrayList[0]->com.h2.mes.vo.BOMVO["type"])]
2020-06-01 15:37:50.251 MES [XNIO-1 task-13] DEBUG o.s.web.servlet.DispatcherServlet - Termination 400 BAD_REQUEST
2020-06-01 15:37:50.251 MES [XNIO-1 task-13] DEBUG o.s.web.servlet.DispatcherServlet - "ERREUR" envoi pour POST "/erreur", paramètres={}

ajouter un argument jvm fonctionne pour moi. java -Dfile.encoding=UTF-8

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