본문 바로가기
Develop/Java

[Java] String to Json 파싱하기 | Jackson ObjectMapper

by 독서왕뼝아리 2023. 4. 2.

 

온갖 JSON 파싱 방법 찾아서 적용하니까 코드가 더럽거나 실패했다. 그나마 가장 깔끔한 방법을 찾아서 공유한다!!!!

 

 

파싱 유목민 여기서 정착하다...

공식 문서 : https://www.baeldung.com/jackson-deserialize-json-unknown-properties

 


 

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

//...

ObjectMapper mapper = new ObjectMapper();
ParsingDto dto = mapper.readValue(decoded, ParsingDto.class);

Jackson에서 제공하는 ObjectMapper를 이용하면 DTO 클래스와 Json 형식의 String으로 아주 깔끔하고 손쉽게!!!!!!!!! String을 Json 객체로 변환할 수 있다.

 

 

 

{
  "iss": "https:{value}",
  "azp": "356580{value}",
  "aud": "356580{value}",
  "sub": "10980{value}",
  "at_hash": "otFV{value}",
  "name": "{value}",
  "picture": "https://{value}",
  "given_name": "{value}",
  "family_name": "{value}",
  "locale": "ko",
  "iat": 167{value},
  "exp": 167{value}
}

Google OAuth2로 받아온 개인 정보를 복호화한 내용을 바탕으로 Member 도메인 객체로 변환하는 작업을 하려고 한다. Google에서 제공하는 정보는 다음과 같은데, 나는 pub(식별 아이디), name, picture만 필요하다.

 

편의를 위해 JSON 형식으로 표현했지만 String 객체이다.

 

 

 

필요한 정보만 저장하려고 다음과 같이 MemberDto를 생성했다. 

@NoArgsConstructor
@Getter
public class MemberInfoDto {
    private String sub;
    private String name;
    private String picture;

    @Builder
    public MemberInfoDto(String sub, String name, String picture) {
        this.sub = sub;
        this.name = name;
        this.picture = picture;
    }

    public Member toEntity() {
        return Member.builder()
                .oAuthId(sub)
                .name(name)
                .picture(picture)
                .build();
    }
}

이제 이걸 Object Mapper로 파싱해보자!

 

 

 

ObjectMapper mapper = new ObjectMapper().readValue(decoded, MemberInfoDto.class);

라고만 코드를 작성하면 오류가 날 것이다. 왜냐면 MemberInfoDto는 파싱하려는 JSON의 모든 key 값(iss, azp, aud 등등)을 포함하지 않기 때문이다. 따라서 다음처럼 설정을 해야 한다.

 

 

 

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MemberInfoDto dto = mapper.readValue(decoded, MemberInfoDto.class);

역직렬화 시 Unknown 프로퍼티가 있을 때 실패 유발하는 옵션을 꺼버리는 설정이다. 이 외에도 다양한 옵션을 껐다 킬 수 있으니 Jackson 공식문서에서 찾아보자.