9C BLOG
JSON 파싱 오류 해결 본문
1. 신규 데이터를 받기 위해서 API를 호출하여 JSON Array 를 String으로 받아오게 되어있는데
해당 데이터를 받아서 ObjectMapper로 읽어오다가 에러가 났다.
ObjectMapper objMapper = new ObjectMapper();
String plainJson = "~~"; // String 으로 받은 JsonArray
JsonNode listNode = objMapper.readTree(plainJson);
com.fasterxml.jackson.databind.JsonMappingException: Illegal unquoted character ((CTRL-CHAR, code 9))
readTree에서 JsonArray를 파싱하다가 에러가 난 것 같았다.
데이터 중 뭔가 조금 이상한 것 같은데 찾을 수가 없다ㅜㅜ
해결책은 일단 ObjectMapper에 옵션을 주는 것이었다!
ObjectMapper objMapper = new ObjectMapper();
String plainJson = "~~"; // String 으로 받은 JsonArray
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); // 옵션 추가
JsonNode listNode = objMapper.readTree(plainJson);
위의 옵션을 추가하고 나서 다시 실행하니 에러가 해결되었다!!
하지만 해당 옵션은 deprecated 되었다고 계속 경고가 떴다,,,,
그러면 이제 뭘 써야하냐!!!
대신 이걸로 쓰라고 한다.
http://javadox.com/com.fasterxml.jackson.core/jackson-core/2.10.3/deprecated-list.html
ObjectMapper objMapper = new ObjectMapper();
String plainJson = "~~"; // String 으로 받은 JsonArray
// 옵션 추가 - deprecated 됨
//objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
// 이제 이걸로 쓰자!
objectMapper.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS, true)
JsonNode listNode = objMapper.readTree(plainJson);
그리고 바꾸는 김에 봤더니 해당 JSON을 파싱하는 것부터 바꿔야겠다
ObjectMapper objMapper = new ObjectMapper();
String plainJson = "~~"; // String 으로 받은 JsonArray
JSONArray jsonArray = new JSONArray(plainJson);
for(int i=0; i<jsonArray.length(); i++){
// with로 옵션까지 한 줄로!!
EduVO eduVO = objectMapper.readerFor(EduVO.class).with(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS).readValue(jsonArray.get(i).toString());
}
직접 VO에 set하고 있던데 VO에 필요한 필드로만 생성자를 만들어서 @JsonCreator 어노테이션을 붙여주고
해당 필드 파라미터에 @JsonProperty 어노테이션을 붙여주어 알아서 매핑되도록 하였다.
수십줄의 set하는 코드가 한줄로 끝나버렸다!!!! 휴
@JsonCreator
public EduVO(@JsonProperty("CRS_ID") String crsId){
this.crsId = crsId;
}
https://steemit.com/java/@dongchimi/json
Json 파싱 중 오류 모음 — Steemit
com.fasterxml.jackson.databind.JsonMappingException: Illegal unquoted character ((CTRL-CHAR, code 9)): -> 해결책 objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true) 추가. 참고 url : https://stackoverflow.com/questions/31537153/jsonpar
steemit.com
'STUDY > JAVA' 카테고리의 다른 글
JSON parsing to class (0) | 2023.11.23 |
---|---|
스레드와 프로세스의 차이 (0) | 2023.11.03 |
병렬과 동시성의 차이점을 말해주세요. (0) | 2023.10.30 |
Java Collections (0) | 2023.10.30 |
자바 컨테이너란 무엇인가요? (0) | 2023.07.17 |