자바(SE)

Gson과 Json을 이용한 타입 파라미터 처리

  • -

아래와 같은 json 데이터를 json과 jackson을 이용해서 처리해보자.

{
  "checkList": {
    "check": [
      {
        "code": "1000",
        "date": "2010.10.01",
        "clean": "H",
        "ready": "H",
        "response": "M"
      },
      {
        "code": "1001",
        "date": "2010.10.02",
        "clean": "H",
        "ready": "H",
        "response": "M",
        "request": "air clean!!"
      }
    ]
  }
}

 

단순한 구조로 전체 map > ckeckList(map) > check(list)로 되어있으며 list안의 요소들은 다음의 java 클래스로 표현할 수 있다.

import java.util.Date;

public class Check {
	private String code;
	private Date date;
	private String clean;
	private String ready;
	private String response;
	private String request = "";

	// setter / getter

	@Override
	public String toString() {
		return "[" + code + ", " + date + ", " + clean + ", " + ready + ", " + response + ", " + request + "]";
	}
}

 

json 문자열을 파싱해서 객체로 매핑하기 위해서는 일반적으로 다음과 같이 사용하고 싶다.!

ObjectMapper om = new ObjectMapper();

Map<String, Map<String, List<Check>>> checks 
  = om.readValue(new File("./bin/w4/day2/lab/share/data/result.json"), Map.class);

 

하지만 readValue의 두 번째 파라미터는 class 타입으로 타입 파라미터를 지정할 수 없기 때문에 런타임 오류가 발생한다. (LinkedHashMap을 Check로 형변환 할 수 없다.!!) Map으로 받은 후 다시 형변환 처리해야 한다.

 

이때 TypeReference 타입을 이용하면 간단히 처리할 수 있다.

Map<String, Map<String, List<Check>>> checks 
    = om.readValue(new File("./bin/w4/day2/lab/share/data/result.json"), 
                   new TypeReference<Map<String, Map<String, List<Check>>>>() {});

 

gson에서는 Type을 사용한다.

public static void byGson() {
	GsonBuilder builder = new GsonBuilder().setDateFormat("yyyy.MM.dd");
	Gson gson = builder.create();
	Type type = new TypeToken<Map<String, Map<String, Object>>>(){}.getType();
	Map<String, Map<String, List<Check>>> checks = gson.fromJson(reader, type);
	System.out.println(checks);
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.