Retrofit2 - jsonElement 데이터 파싱 과정간 마주한 문제

colins·2023년 2월 2일
2

우선, 레트로핏2 라이브러리를 사용하여 API로 데이터를 성공적으로 호출하였으나,

받아온 데이터 중 "원하는 데이터만 추출(?)하는 과정" 에서 문제가 발생하였다.


내가 원하는 데이터는 "raw"(사진 URL 주소가 담겨있음) 라는 항목이며,
이것은 "results 배열 내부의 urls 객체 내부"에 담겨있는 상태였다.

//데이터
{"total":10000,"results":[{"urls":{"raw":"https://images.~



먼저, response.body() 에서 내가 보고싶은 데이터가 들어있는 results 배열만 꺼내고자 하였다.

response.body().let { jsonElement ->
                    val body = jsonElement?.asJsonObject
                    val resultsArray = body?.getAsJsonArray("results")

로그를 찍어보니 내가 원하던대로 배열이 추출되었다.




이를, 다시 jsonObject 로 읽고 싶어서 변수를 선언하였다.
 val resultArrayToObject = resultsArray?.asJsonObject

위 코드를 추가하여 실행한 결과, 앱이 죽었다..


에러코드를 읽어보니 "java.lang.IllegalStateException: Not a JSON Object: ~" 라고 떴다.

해석해보니 "니가 읽으려는건 jsonArray인데, 이걸 왜 jsonObject로 읽으려 하냐?"
라는 느낌 같았다.

resultsArray?.forEach { jsonElement ->
                        
                        val jsonObjects = jsonElement.asJsonObject

                        val getRawString = jsonObjects.get("urls").asJsonObject.get("raw").asString
                    }

문제를 해결하기 위해,

"배열 안의 데이터를 한줄씩 표현해보자" 하여 forEach 문을 돌리고,
"urls" 객체 내부의 "raw" 객체에 접근하기 위해 위와 같이 코드를 짰다.

실행하였더니 내가 원하는 raw 객체에 대한 데이터만 추출되었다.




- 결론 -

아직 json 데이터의 구조(객체 or 배열)을 읽는 것이 더디고,
데이터 가공 과정이 익숙치 않고,
json 데이터의 각 항목에 접근하는 방식에 대한 지식이 부족한 상태인 것 같다.

여러 구조의 데이터 가공 과정을 반복 실습하며 익숙해지도록 노력하자!

profile
꾸준하게 배우자

0개의 댓글