jackson라이브러리의 ObjectMapper를 활용해서 json to Map(또는 VO), Map(또는 VO) to json으로 변환하는 방법을 소개한다.
먼저 jackson 라이브러리의 의존성을 추가한다.
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.15.0'
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core/2.15.0 참고!
다음과 같은 json을 'jsonStr'이라는 String변수에 담았다고 가정할때.
{
"id":961113,
"name":"뉴브이",
"job":"backend developer",
"skill" : ["java", "spring", "sql"]
}
다음과 같이 ObjectMapper객체를 준비하고..
ObjectMapper objectMapper = new ObjectMapper();
spring을 사용한다면 빈등록 및 멤버필드 또는 생성자 주입하는 것을 추천!
Map<String, String> profileMap = objectMapper.readValue(jsonStr, Map.class);
// {id=961113, name=뉴브이, job=backend developer, skill=[java, spring, sql]}
String newJsonStr = objectMapper.writeValueAsString(profileMap);
// {"id":961113,"name":"뉴브이","job":"backend developer","skill":["java","spring","sql"]}
참쉽죠? 추가적으로 개행된 json문자열로 변환하고 싶다면...
String prettyJsonStr = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(profileMap);
/**
{
"id" : 961113,
"name" : "뉴브이",
"job" : "backend developer",
"skill" : [ "java", "spring", "sql" ]
}
*/
디버그용도로 로그찍을때 사용하면 좋을거 같다.
그리고 json으로 변환하기위한 메서드 사용시 JsonMappingException, JsonProcessingException 와 같은 예외는 깔끔하게 다뤄주자. (던지거나 캐치하거나)
만약 본인이 개발하는 프로젝트에서 Map사용을 지양한다면 VO객체로도 얼마든지 json으로 변환하거나 json을 VO객체로 만들수 있다.
예를들어.. 다음과 같은 VO클래스가 있다면...
@Getter
@Setter
@ToString
public class ProfileVO {
private int id;
private String name;
private String job;
private String[] skill;
}
ProfileVO profileVO = objectMapper.readValue(jsonStr, ProfileVO.class);
// ProfileVO(id=961113, name=뉴브이, job=backend developer, skill=[java, spring, sql])
String newJsonStr = objectMapper.writeValueAsString(profileVO);
// {"id":961113,"name":"뉴브이","job":"backend developer","skill":["java","spring","sql"]}
참고로 ObjectMapper의 기본설정으로는 모든 json 데이터의 키가 VO객체의 멤버필드에 존재해야하며 관련한 별개의 설정은 추후 포스팅에 소개하겠다.
마지막으로 성능상으로 jackson이 gson이나 json-simple보다 뛰어나다고 하니... jackson 적극추천하는 바이다.