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);
메모장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
'programing' 카테고리의 다른 글
material-ui 날짜 선택기를 사용할 수 없습니다. (0) | 2023.04.02 |
---|---|
자바스크립트 내부대체가 아닌 HTML 추가 (0) | 2023.04.02 |
리액트에서의 코멘트 사용방법 (0) | 2023.03.28 |
각도에서의 "href"와 "ng-href"의 차이JS (0) | 2023.03.28 |
리액트 메모는 언제 사용하면 안 되나요? (0) | 2023.03.28 |