복잡한 구조의 JSON 파싱하기

개발노트

2022. 7. 29. 08:08


먼저 필요한 dependency가 있다.

바로 json-simple이다.

(Maven의 경우 아래와 같다.)

<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

 

 


 

다음과 같은 JSON 응답이 들어왔다.

 

그 중에서 난 'items'만 필요하다.

response > body > items로 하나씩 파싱을 해보았다.

 

여기서 아까 주입한 json-simple의 JSONParser가 쓰이게 된다.

위 사진과 같은 JSON 응답은 String 객체 result로 만들었다.

이것으로 result를 한 번 파싱해서 JSONObject형태로 만들어 준다.

JSONParser parser = new JSONParser();
JSONObject parsedResult = (JSONObject) parser.parse(result);

 

이제 response > body > items로 한 단계씩 깊이 파싱해보겠다.

메서드 get(key)의 형태로 하나씩 파싱하면 된다.

코드는 아래와 같다.

JSONObject response = (JSONObject) parsedResult.get("response"); //response
JSONObject body = (JSONObject) response.get("body"); //body
JSONArray items = (JSONArray) body.get("items"); //items

 

내가 추출한 객체 items는 지금 JSONArray형태이다.

이를 보편적인 형태인 List<Items>로 변환하고자 한다.

복수객체인 List이니 TypeReference를 써보았다. (이는 stackoverflow의 도움을 받았다)

ObjectMapper mapper = new ObjectMapper();
List<Item> itemList = mapper.readValue(items.toString(), new TypeReference<>(){});

(※ 실제 코드에서는 DTO 형태도 고려해야 될 듯 싶다.)

 

이렇게 해서 내가 뽑은 itemList를 하나씩 시험출력 해보았다.

(※ 실제 코드에서는 Slf4j를 권장한다.)

 

문제없이 잘 나왔다.

 


 

내 방법을 요약하자면 다음과 같다.

 

1. com.googlecode의 json-simple을 준비한다.

2. JSON 응답을 String 객체로 만들어서 JSONParser에 넣어 파싱한다.

3. 알맞는 형태(JSONXxx)의 객체로 단계별로 파싱한다.

4. items는 복수형태의 객체이다. readValue를 쓸 때, TypeReference형태로 넣어줘서 썼다.