개발을 하다보면 JSON을 많이 사용하게 된다. Class 의 Instance 를 Json 으로 바꿀 상황도 많고, Json 을 Instance 로 바꾸는 상황도 많은데. 이것을 간편하게 ObjectMapper 를 이용하여 처리할 수 있다. Spring Boot 시절에 아닐 때는 Pom.xml 에서 Jackson Repository 를 추가해줘야만 사용할 수 있었으나, 요즘에는 기본적으로 들어있으므로 그냥 사용이 가능하다.
Spring Component 에서 생성자 주입 또는 @Autowired Annotation 을 이용하면 간단히 ObjectMapper 를 사용할 수 있고, 아니면 그냥 Instance 화 시켜서 사용해도 된다.
@Data
public class Person {
private String name;
private Sex sex;
private String phoneNumber;
...
}
Person person = new Person();
person.setName("홍길동");
person.setSex(Sex.Male);
person.setPhoneNumber("01012341234");
ObjectMapper objectMapper = new ObjectMapper();
String result = objectMapper.writeValueAsString(person);
System.out.println(result);
// 출력
// Person : { name : "홍길동", sex : "Male", phoneNumber : "01012341234" }
@Data
public class Person {
private String name;
private Sex sex;
private String phoneNumber;
...
}
String inputData = "{ name : "홍길동", sex : "Male", phoneNumber : "01012341234" }"
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(inputData, Person.class);
System.out.println(person.toString());
// 출력
// Person : { name : "홍길동", sex : "Male", phoneNumber : "01012341234" }
ObjectMapper 로 Deserialize 를 진행하는 경우 Json 데이터와 Class 가 정확하게 일치 하지 않으면 데이터 변환이 이루어지지 않는 경우가 있다.
정확히는 Json 데이터의 Field 의 내용은 전부다 가지고 있지만 추가로 다른 Field 를 가지고 있는 경우는 Exception 이 발생하지 않지만, Json 데이터의 Field 를 Class 가 가지고 있지 않은 경우에는 JsonProcessingException 이 발생한다.
이러한 Exception 을 방지시키기 위해서 FAIL_ON_UNKNOWN_PROPERTIES 을 사용한다.
@Data
public class IncompletePerson {
private String name;
private Sex sex;
...
}
String inputData = "{ name : "홍길동", sex : "Male", phoneNumber : "01012341234" }"
ObjectMapper objectMapper = new ObjectMapper();
// 해당 옵션을 설정하지 않으면 Json 데이터의 Field 중에서 Class 의 Field 와 일치하지 않는 Field 가 있기 떄문에 JsonProcessingException 발생
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
IncompletePerson person = objectMapper.readValue(inputData, IncompletePerson.class);
System.out.println(person.toString());
// 출력
// Person : { name : "홍길동", sex : "Male"}
Json 많이 쓰는데 알아두면 좋다.