[Java] ObjectMapper 클래스


Development note/Java  2015. 4. 21. 00:24

안녕하세요. 명월입니다.


이전 포스트에서 클라이언트에서 자바스크립트의 내장 클래스를 이용해 데이터를 JSON형식으로 변환하여 클래스형식으로 변환하는 것에 대해 공부하였습니다.


링크 - [Javascript / 자바스크립트] JSON.stringify 함수

링크 - [Javascript / 자바스크립트] JSON.parse 함수


이번 포스트에서는 클라이언트가 아닌 서버 단에서 오브젝트 형식을 JSON으로 변환 또는 JSON형식을 오브젝트 형식으로 변환하는 방법에 대해 알아보겠습니다.


Java언어에서 Json을 다루는 라이브러리는 크게 두 가지가 있습니다. JavaEE에서 제공하는 Javax.json이랑 공개라이브러리인 Jackson.json이 있습니다.

이 둘의 차이는 표준이냐 아니냐와 성능 차이가 있습니다. JavaEE에서 제공하는 Json 변환 라이브러리는 유연성이 매우 좋고, 표준 라이브러리라 어느 프로젝트에서든 적용하기 편리한 장점이 있으나 단점으로는 많은 부분은 재구현을 해야 하고 성능도 사용자의 역량에 판이하기 때문에 초심자가 사용하기엔 어려움이 있습니다.

그의 반해 오늘 소개할 Jackson.json의 경우는 성능이 좋고, 이미 구현된 부분이 많아서 클래스 선언만으로도 사용하기 편리한 장점이 있으나, 표준 라이브러리가 아니기에 프로젝트 적용 시에 많은 부분을 고려하지 않으면 안 되는 라이브러리입니다.


JavaEE로 Json을 다루는 방법에 대해서는 다음 포스트에서 공부하고 오늘은 이 Jackson을 통해 Json을 다루는 방법에 대해 공부하겠습니다.

먼저 예제를 만들겠습니다.

{"result1":"test1","result2":"test2","result3":["test3","test4],"result4":{"subresult3":"test3","subresult4":"test4"}}

위 예제를 담기 위한 클래스를 먼저 만들어야겠습니다.

import java.util.List;
import java.util.Map;

public class JsonObject {
  private String result1;
  private String result2;
  private List<String> result3;
  private Map<String,String> result4;
  public String getResult1() {
    return result1;
  }
  public void setResult1(String result1) {
    this.result1 = result1;
  }
  public String getResult2() {
    return result2;
  }
  public void setResult2(String result2) {
    this.result2 = result2;
  }
  public List<String> getResult3() {
    return result3;
  }
  public void setResult3(List<String> result3) {
    this.result3 = result3;
  }
  public Map<String, String> getResult4() {
    return result4;
  }
  public void setResult4(Map<String, String> result4) {
    this.result4 = result4;
  }
}
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonExample implements Runnable{
  private String jsonData;
  public JsonExample(){
    
  }
  public String getJsonData() {
    return jsonData;
  }
  public void setJsonData(String jsonData) {
    this.jsonData = jsonData;
  }
  /**
   * 실행 함수
   */
  @Override
  public void run() {
    try{
      //Jackson ObjectMapper선언
      ObjectMapper mapper = new ObjectMapper();
      //Json데이터(String형식)과 변환할 Class를 파라미터에 입력한다.
      JsonObject obj = mapper.readValue(jsonData, JsonObject.class);
      //변환된 값 확인
      System.out.println("result1:"+obj.getResult1());
      System.out.println("result2:"+obj.getResult2());
      for(String listItem:obj.getResult3()){
        System.out.println("listitem:"+listItem);
      }
      for(String key : obj.getResult4().keySet()){
        System.out.println("Map key ("+key+"):"+obj.getResult4().get(key));
      }
      //결과값
      //result1:test1
      //result2:test2
      //listitem:test3
      //listitem:test4
      //Map key (subresult3):test3
      //Map key (subresult4):test4
      
      //Class 값을 Json형식의 String으로 변환      
      String jsonData = mapper.writeValueAsString(obj);
      //결과값
      //{"result1":"test1","result2":"test2","result3":["test3","test4"],"result4":{"subresult3":"test3","subresult4":"test4"}}
      System.out.println(jsonData);
      
    }catch(Throwable e){
      e.printStackTrace();
    }
  }
  /**
   * 시작 메인 함수
   * @param args
   */
  public static void main(String... args){
    //클래스 선언
    JsonExample ex = new JsonExample();
    //Json데이터 담기
    ex.setJsonData("{\"result1\":\"test1\","
            + "\"result2\":\"test2\","
            + "\"result3\":[\"test3\",\"test4\"],"
            + "\"result4\":{\"subresult3\":\"test3\",\"subresult4\":\"test4\"}}");
    //실행
    ex.run();    
  }
}

위 소스를 실행하기 위해서 Json의 라이브러리를 연결해야 합니다.


jackson-annotations-2.5.0.jar

jackson-core-2.5.2.jar

jackson-databind-2.5.2.jar


Maven Repository - jackson-databind

Maven Repository - jackson-core

Maven Repository - jackson-annotations


이클립스 환경에서 라이브러리를 등록하는 방법은 다음과 같습니다.


ObjectMapper라는 클래스를 통해서 JacksonJson의 매핑 클래스를 선언합니다. 다른 다형성 함수도 있으나 저는 일단 String으로돈 Json값을 넣어 Class를 만드는 함수를 사용하였습니다. Json의 키는 변수명이 되는 것이고 값은 값이 되는 구조입니다.

반대로 Class를 String으로 바꾸는 함수에서도 변수명이 Json의 키가 되고 값은 그대로 값이 되어 String 형식이 됩니다.

src.zip