programing

JSON 잘못된 UTF-8 중간 바이트

starjava 2023. 4. 2. 09:39
반응형

JSON 잘못된 UTF-8 중간 바이트

이 에러는, (Jackson, 이 케이스) JSON 엔진이 UTF-8 로 부호화되지 않은 일부의 JSON 를 해석하려고 했을 때에 발생합니다.

UTF-16과 같은 UTF-8과는 다른 무언가를 예상해야 한다는 것을 엔진에 어떻게 알립니까?

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)

JSON 데이터는 UTF-8, UTF-16 또는 UTF-32로 인코딩해야 합니다.JSON 디코더는 바이트스트림의 처음 4개의 옥텟을 조사함으로써 부호화를 판별할 수 있습니다.

       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 등)로 데이터를 부호화하고 있는 것 같습니다.

Java Client 어플리케이션에서 이렇게 JSON을 시리얼화할 때 이 예외가 발생하였습니다.

String json = mapper.writeValueAsString(contentBean);

서버측에서는 Spring Boot을 REST 엔드 포인트로 사용하고 있었습니다.예외는 다음과 같습니다.

nested 예외는 com.sysml.syslog.syslogind입니다.Json Mapping Exception: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를 사용하여 JSON 파일을 저장한 후 이 파일을 받았기 때문에 메모장++로 열고 "UTF-8로 변환"이라고 말해야 했습니다.그리고 효과가 있었다.

만약 그것이 다른 사람들에게 도움이 될 수 있다면, 나는 관련된 일화를 공유하겠다.

PowerShell Integrated Script Environment(ISE; 통합 스크립트 환경)를 통해 PowerShell 스크립트를 실행하고 있을 때 이 오류(Invalid UTF-8 middle byte 0x3f)가 발생했습니다.ISE 외부에서 실행되는 동일한 스크립트는 정상적으로 동작합니다.이 코드에서는 Convergence v3 및 v5.x REST API가 사용되며, 이 에러는 Convergence v5.x 서버에 기록됩니다.이것은 ISE가 어떤 이유로든 요구를 뮤크하기 때문입니다.

이 오너가 내 문제를 해결했다.다음은 그 복사본입니다.

-Dfile.encoding=으로 JVM을 시작해야 합니다.UTF-8. JVM은 기본적으로 운영 체제 문자 집합으로 설정됩니다.

예를 들어 JBoss 독립 실행형 또는 Eclipse에서 실행되는 JBoss에 추가할 수 있는 JVM 인수입니다.

제 경우, 이 문제는 팀원 중 한 명의 컴퓨터에서만 단독으로 발생했습니다.다른 사람들은 모두 이 문제 없이 일하고 있었다.

Mapper에서 String으로 JSON을 입수하여 직접 작성했기 때문에 플랫폼마다 일관성이 없었습니다.어떤 경우에는 ansi로, 어떤 경우에는 UTF8로 정확하게 파일에 들어갑니다.로 전환했습니다.

mapper.writeValue(file, data);

매퍼에게 파일 조작을 맡겼는데 잘 작동하기 시작했어요

클라이언트 텍스트 프로토콜

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保存成功"}

스프링 부트 컨트롤러 코드는 다음과 같습니다.

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

루프백 인터페이스로 디버깅하면 정상적으로 동작합니다.bat 명령어를 통해 인터넷 서버에 전개하는 동안 오류가 발생하였습니다.

ServletInvocableHandlerMethod - Could not resolve parameter [0] in public XXXController.save(com.h2.mes.query.BOMSaveQuery): JSON parse error: Invalid UTF-8 middle byte 0x3f; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 middle byte 0x3f
 at [Source: (PushbackInputStream); line: 9, column: 32] (through reference chain: 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] WARN  o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Invalid UTF-8 middle byte 0x3f; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 middle byte 0x3f
 at [Source: (PushbackInputStream); line: 9, column: 32] (through reference chain: 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 - Completed 400 BAD_REQUEST
2020-06-01 15:37:50.251 MES [XNIO-1 task-13] DEBUG o.s.web.servlet.DispatcherServlet - "ERROR" dispatch for POST "/error", parameters={}

jvm 인수를 추가하면 됩니다.java -Dfile . encoding =UTF-8

언급URL : https://stackoverflow.com/questions/6352861/json-invalid-utf-8-middle-byte

반응형