문제사항
Json 예시
[{ "id":1 , "name":"Lucy" }]
Json을 역직렬화하려는 도중 계속해서 오류가 났다 ㅠㅠ
cohttp://m.fasterxml.jackson.core.io.JsonEOFException: Unexpected end-of-input: expected close marker for Object (start marker at [Source: (String)"{"id":14"; line: 1, column: 1]) at [Source: (String)"{"id":14"; line: 1, column: 9] |
문제 코드
@Test
public void testSingleObjectJsonParsing(List<String> jsonList) throws IOException {
//jsonList=[{\"id\":1, \"name\":\"Lucy\"}]
ObjectMapper objectMapper = new ObjectMapper();
List<ItemDto> itemList = new ArrayList<>();
jsonList.forEach(s -> {
try {
itemList.add(objectMapper.readValue(s, Item.class));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
});
}
log를 보니 s가 [{ "id":1 였다.
jsonList의 size도 2로 나옴(예상한건 1)
특이한 점은 [{ "id":1 , "name":"Lucy" }, { "id":2 , "name":"Jini" } ] 같이 json이 여러개일 때는 예외가 발생하지 않는다. (size도 정확함)
테스트코드 실행 결과
java.lang.RuntimeException: cohttp://m.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `cohttp://m.example.youtubeSheet.post.dto.PostImageDto` from Array value (token `JsonToken.START_ARRAY`) |
MismatchedInputException는 객체로 변환하려고 할 때, 예상된 데이터 타입과 실제 JSON 데이터의 타입이 일치하지 않다라는 의미다
그래서 readValue 함수를 좀 찾아보다가 TypeReference로 해보기로 했다 !!
아래는 수정 코드다
@Test
public void testSingleObjectJsonParsing(List<String> jsonList) throws IOException {
ObjectMapper objectMapper=new ObjectMapper();
String json=jsonList.toString();
List<PostImageDto> deleteImageList=objectMapper.readValue(json, new TypeReference<List<PostImageDto>>(){});
}
기존 - 리스트 요소를 하나씩 역직렬화해서 새로운 리스트에 추가, Json이 1개 일 때 mismatch 예외
변경 - 리스트를 toString 한 후 new TypeReference<List<Object>>(){}를 통해 새로운 리스트 생성.
느낀점
삽질을 너무 오래했다 .. TypeReference는 오늘 처음 봄
역직렬화를 너무 readvalue(s,Item.class)로만 알고있었던 것 같다 ... ㅋㅋ ㅠㅠ
반성하고 공부하자 ..
'WEB > Frontend' 카테고리의 다른 글
쿼리 문자열의 특수문자 허용, relaxedQueryChars (0) | 2024.10.27 |
---|---|
request user-agent (0) | 2024.10.27 |
one-way 애니메이션 (0) | 2024.03.02 |