[android / kotlin] 공공 api를 사용하여 얻은 json 파싱하기

allocProc·2020년 1월 13일
0

android

목록 보기
1/3

공공데이터포털의 도로위험지수 api를 사용하였습니다.

시작 좌표와 끝 좌표를 넘겨주면 해당 도로의 도로위험지수를 돌려줍니다.

작은 길가나 골목의 경우 api가 지원을 안해서

{
    "resultCode": "10",
    "resultMsg": "INVALID_REQUEST_PARAMETER_ERROR"
}

이렇게 "INVALID_REQUEST_PARAMETER_ERROR" 메시지를 출력합니다.

제대로 된 좌표로 요청할 경우

{
    "resultCode": "00",
    "resultMsg": "NORMAL_CODE",
    "items": {
        "item": [
            {
                "index": 1,
                "line_string": "(129.066456 35.208912, 129.066456 35.208912)",
                "anals_value": "0.00",
                "anals_grd": "01"
            }
        ]
    },
    "totalCount": 1,
    "numOfRows": 1,
    "pageNo": 1
}

이렇게 제대로 된 값을 줍니다.

저는 anals_grd만 쓰도록 하겠습니다.

api 통신을 위해 Asynctask를 사용하였습니다.

코드가 난잡하지만 이해바랍니다.

private fun getDangerGrade(startLat:String, startLng:String, endLat:String, endLng:String) {
        lateinit var temp : String
        class getDangerGrade : AsyncTask<Void, Void, Void>(){
            override fun doInBackground(vararg params: Void?): Void? {
                val stream = URL("http://apis.data.go.kr/B552061/roadDgdgrLink/getRestRoadDgdgrLink?serviceKey=[KEY]" +
                        "searchLineString=LineString("+
                        startLng + " " +
                        startLat + ", " +
                        endLng + " " +
                        endLat + ")&vhctyCd=1&type=json&numOfRows=10&pageNo=1").openStream()
                val read = BufferedReader(InputStreamReader(stream,"UTF-8"))
                temp  = read.readLine()

                return null
            }

            override fun onPostExecute(result: Void?) {
                val grade : String
                super.onPostExecute(result)
                val json = JSONObject(temp)
                if(json.get("resultCode") != "10") {
                    val chiefObject = (json["items"] as JSONObject)
                    val upperArray : JSONArray = chiefObject.getJSONArray("item")
                    val upperObject = upperArray.getJSONObject(0)
                    grade = upperObject.getString("anals_grd")

                }
                else
                    grade = "none"
            }
        }
        getDangerGrade().execute()
    }

처음에는 그저 단순하게 받은 json에서 그대로 get("anals_grd") 했더니 "anals_grd" 값을 찾을 수 없답니다.

자세히 보니 items 하위에 item이 Array입니다.

그래서 item을 따로 JSONArray로 빼준 후 다시 get("anals_grd") 하여 제대로 위험지수를 가져올 수 있었습니다.

profile
많이 부족합니다.

0개의 댓글