자바(SE)

JSON 문자열 처리

  • -

자바 프로그래밍에서 JSON 문자열을 처리하기 위해 일반적으로 Gson 또는 Jackson 라이브러리를 사용할 수 있다. 간단하게 이 둘의 사용법을 비교해보자.

여기서 처리해볼 JSON data는 영화진흥위원회의 오픈 API이다.

API의 url은 아래와 같다.

http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20120101

 

전체 데이터 중 관심있는 부분은 bookOfficeResult > dailyBoxOfficeList에 배열 형태로 들어있는 영화 정보이다.

다음은 영화 정보를 가지고 있을 자바 객체이다.

// 불필요한 필드들은 제거하기 위해서 아래 애너테이션 추가
@JsonIgnoreProperties(ignoreUnknown = true)
static class MovieInfo {
	private Integer rnum;
	private Integer rank;
	private String movieNm;
	Date openDt;

    // setter / getter 추가
    
	@Override
	public String toString() {
		return "MovieInfo [rnum=" + rnum + ", rank=" + rank + ", movieNm=" + movieNm + ", openDt=" + openDt + "]";
	}
}

클래스 선언부에 있는 @JsonIgnoreProperties 속성은 Jackson에서 필요한 것으로 json -> 객체 매핑 시 불필요한(매핑하지 않을) 요소들은 무시하라는 의미이다.

 

다음은 open api를 이용해 json 문자열 형태로 데이터를 가져와서 jsonData에 저장하는 부분이다.

private static String jsonData;
private static void getJsonData() throws IOException {
	URL url = new URL("http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20120101");
	InputStream input = url.openStream();
	BufferedReader br = new BufferedReader(new InputStreamReader(input));
	jsonData = br.readLine();
}

이제 gson을 이용해 jsonData 문자열을 파싱하고 필요한 영화정보를 받아보자.

private static void byGson() {
	// 표준 ISO 스타일이 아닐 경우는 포멧 지정 필요
	GsonBuilder builder = new GsonBuilder().setDateFormat("yyyy-MM-dd");
	Gson gson = builder.create();
	Map<String, Map<String, Object>> map = gson.fromJson(jsonData, Map.class);
	List<Map<String, Object>> dailyBoxOfficeList = (List)map.get("boxOfficeResult").get("dailyBoxOfficeList");
	for(Map<String, Object> info: dailyBoxOfficeList) {
		// 문자열로 변경 후 다시 객체로 변환할 수밖에 없나..
		String strInfo = gson.toJson(info);
		MovieInfo mi = gson.fromJson(strInfo, MovieInfo.class);
		System.out.println(mi);
	}
}

MovieInfo에는 문자열이 아닌 Date 타입이 들어있기 때문에 문자열 -> Date로 변경하기 위한 포멧을 등록해야한다. 따라서 바로 Gson을 만들지 않고 GsonBuilder를 사용했다. 다만 여기서 주어진 날짜의 포멧은 ISO 형식이므로 위 예에서플 사용하지 않아도 무관하다.

 

필요한 지점까지 이동한 후 리스트 안의 Map을 드디어 MovidInfo로 변환할 수 있다. 

이때 Map -> Json 문자열 -> MovieInfo의 과정을 거친다.

 

다음으로 jackson을 이용해보자.

private static void byJackson() throws IOException {
	ObjectMapper mapper = new ObjectMapper();
	mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));

	Map<String, Map<String, Object>> map = mapper.readValue(jsonData, Map.class);
	List<Map<String, Object>> dailyBoxOfficeList = (List)map.get("boxOfficeResult").get("dailyBoxOfficeList");
	for(Map<String, Object> info: dailyBoxOfficeList) {
		MovieInfo mi = mapper.convertValue(info, MovieInfo.class);
		System.out.println(mi);
	}
}

jackson에서도 날짜 포멧 변경을 설정할 수 있으며 gson과 마찬가지로 여기서는 ISO 형태이므로 생략 가능하다.

영화 정보 Map을 MovieInfo로 변환할 때는 간단히 convertValue를 사용하면 된다.

Contents

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

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