-
[Android/Kotlin] Retrofit과 OKHttp를 사용하여 공공데이터포털 json 파싱하기, MaterialCalendar 공휴일/휴일 빨간색 데코레이터 추가Android/Kotlin 2022. 9. 5. 20:33반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
- 공연 티켓 관리 앱을 개발하던 중 MaterialCalendarView에 휴일 숫자를 빨간색으로 변경할 일이 있어 공공데이터포털을 이용하게 되었다
https://jeong-yeon.tistory.com/62
*Retrofit 관련 내용은 위 포스팅 참고*
val okHttpClient = OkHttpClient.Builder() .readTimeout(5, TimeUnit.SECONDS) .connectTimeout(5, TimeUnit.SECONDS) .build() val retrofit = retrofit2.Retrofit.Builder().baseUrl("http://apis.data.go.kr") .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build() val service = retrofit.create(RetrofitService::class.java) service.get_holiday().enqueue(object: retrofit2.Callback<String>{ override fun onResponse(call: Call<String>, response: Response<String>) { System.out.println("성공") System.out.println("결과"+response.body()) Json_to_List().HolidayJson_to_List(response.body().toString()) } override fun onFailure(call: Call<String>, t: Throwable) { System.out.println("실패") System.out.println("원인"+t.printStackTrace()) } })
- TimeOut으로 인한 java.net.SocketTimeoutException을 방지하기 위해 OkHttp를 사용해서 타임아웃 시간을 길게 지정해 주었음(OkHttp를 사용하지 않은 경우 TimeOut 시간이 너무 짧아 간헐적으로 서버에서 데이터를 가져오지 못하는 문제 발생함)
- java.net.SocketTimeoutException은 기본적으로 https를 사용하면 해결되지만 공공데이터포털의 주소는 http로 시작하기 때문에 타임아웃 시간 지정해줌
- baseUrl에는 공공데이터포털 주소 넣어줌
- Json_to_List() 클래스 == Mapper 클래스
@GET("/주소") fun get_holiday( ): Call<String>
- url 값의 일부를 동적으로 사용하고 싶은 경우
- 아래의 코드를 get_holiday()의 매개변수로 solYear=calendar_year와 같은 역할을 함(주소에서 solYear= 부분은 지움)
@Query("solYear") calendar_year: Int
class Json_to_List { fun HolidayJson_to_List(str: String): List<String>{ val response = JSONObject(str).getString("response") val body = JSONObject(response).getString("body") val items = JSONObject(body).getString("items") val item = JSONObject(items).getString("item") val jsonArray = JSONArray(item) var list = mutableListOf<String>() for (i in 0 until jsonArray.length()){ list.add(jsonArray.getJSONObject(i).get("locdate").toString()) } return list } }
- response : String 형태로 읽어온 데이터를 JSONObject 메서드로 JSONObject 형태로 변환한 뒤 해당 JSONObject에서 response에 해당하는 내용만 String 형태로 가져옴
- ~~ item까지 마찬가지로 진행
- list : String 형태로 가져온 item(JSONArray 형식)을 JSONArray로 변경한 후 item의 길이만큼 JSONObject를 추출해 list에 담아줌
반응형'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] MaterialCalendarView 커스텀 (0) 2022.09.08 [Andoird/Kotlin] Koin 사용법 (0) 2022.09.06 [Android/Kotlin] DatePicker 초기화 (0) 2022.08.31 [Android/Kotlin] startAcitivtyForResult() 대체 (0) 2022.08.31 [Android/Kotlin] 카드 뷰(CardView) (0) 2022.08.25