본문 바로가기
Java

JSON 파싱하기.

by 완기 2021. 2. 1.
728x90
반응형

API 연동 업무를 진행하던 중, JSON 데이터를 수집해서 데이터를 재가공할 일이 생겼다.

기존에 JSON 데이터를 사용할 땐, 복잡한 데이터가 없어 gson으로 DTO에 바로 매핑을 시켰지만.

이번 업무에는 JSON Object안에 JSON Array가 있는 경우라 애를 많이 먹었다.

위와 같은 데이터를 받고 어떻게 접근하지? 가 고민이 되었다.

일단 나는 sites 이하의 데이터만 필요했다.

그러려면 data와 office의 데이터를 버리고 그 안에 데이터만 가져올 방법을 구글링 하다가 찾았다..

일단 {} 안 데이터는 JSON Object로 파싱이 가능하고

[] 안 데이터는 JSON Array로 파싱이 가능하다.

그렇다면 sites까지는 Object로 키를 추출해야 한다.

일단 나의 경우는 API 규격에 맞춰 json으로 데이터와 token을 OutputStream으로 보내고 InputStream으로 specify 한 정보를 readLine 해서 StringBuilder로 tostring 해서 return값을 받았다.

이렇게 받게 되면 데이터 타입이 String이기 때문에 Jsonparser로 JSON형태로 파싱을 해줘야 했다.

json parser로 파싱 한 값을 Object로 형 변환해서 오브젝트에 할당하게 되면 제일 위 이미지와 같은 JSON을 다룰 수 있게 된다.

앞서 말했듯, 나는 sites 하위 정보만 필요했기 때문에 obj.get("key")를 통해 제일 상위 JSON오브젝트에 접근했고,

그다음 데이터 접근을 위해 office에 순차적으로 접근, 그리고 sites부터는 [] 안에 데이터가 담겨있기 때문에 Array로 형 변환 해준 후 접근했다.

그다음에 생긴 문제는 metrics안에 또 배열이 있어서, 저 데이터들은 어떻게 접근해야 하는지 고민을 사용하면 되지 않을까 하고 사용해봤다.

이너 클래스를 사용해보자라는 참신하지만 무모한 생각대로 gson을 사용해봤지만 metrics의 값들은 모조리 NPE가 발생했다.

이것 또한 방법을 찾아보면서 해결책 아닌 해결책을 얻었다.

참고:
DTO Inner Class 사용 방식 (인프런 김영한) (새창)

 

위 답변은 배민 개발자 김영한 님께서 남기신 댓글이다. 

 

위 댓글을 참고해서 다른 방법을 찾다가 Metrics도

DTO를 만들어주고 상위 object를 매핑시킬 DTO에 변수로 Metrics형 ArrayList를 추가햐주고 돌려봤다.

 

*개별 객체는 object고 전체가 array object라서 gson을 이용해 for in문을 위와 같이 사용했다.*

콘솔을 찍어보니 아래와 같이 데이터가 잘 나왔다.

 

참고 : androman.tistory.com/38

728x90
728x90

댓글