본문 바로가기

WEB/Frontend

JsonEOFException

문제사항

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