관리 메뉴

hyeals study

오픈 API 데이터 가져오기(JSON 문서) 본문

안드로이드

오픈 API 데이터 가져오기(JSON 문서)

hyeals 2020. 5. 17. 18:01

- 공공 데이터 포털에서 오픈 API인 주소 기준 동네별 공적 마스크 판매정보 제공 서비스(https://www.data.go.kr/data/15057411/openapi.do)를 이용해서 데이터를 가져오는 연습을 할 것


- URL을 누르면 아래와 같은 창이 뜸

 


- 위 사진에 나와있는 URL 주소에 들어가면, 아래와 같은 JSON문서가 나옴

 

 

◎ 여기서 가져올 데이터 목록

  1. address: 주소
  2. count: 조회 데이터 개수
  3. addr: 판매처 주소
  4. name: 판매처 이름
  5. remain_stat: 재고 상태

 

* json에서 데이터를 가져오기 위해서 문서 양식 대로하면 됨


- 네트워크를 사용하기 때문에 AndroidManifest.xml에 아래와 같은 코드를 추가함

(인터넷 사용 권한을 허용하는 것)

 

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

- activity_main.xml의 레이아웃을 디자인함

 


[MainActivity.kt]

 

* 코드 설명은 주석

 

package com.example.publicmaskinfo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStreamReader
import java.net.URL

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textView.text = ""

		// 버튼을 누르면 쓰레드 동작
        button.setOnClickListener {
        	// 쓰레드 생성
            var thread = NetworkThread()
            thread.start()
        }
    }

	// 네트워크를 이용할 때는 쓰레드를 사용해서 접근해야 함
    inner class NetworkThread: Thread(){
        override fun run() {
        	// 접속할 페이지 주소: Site
            var site = "https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/storesByAddr/json"
            var url = URL(site)
            var conn = url.openConnection()
            var input = conn.getInputStream()
            var isr = InputStreamReader(input)
            // br: 라인 단위로 데이터를 읽어오기 위해서 만듦 
            var br = BufferedReader(isr)

			// Json 문서는 일단 문자열로 데이터를 모두 읽어온 후, Json에 관련된 객체를 만들어서 데이터를 가져옴
            var str: String? = null
            var buf = StringBuffer()

            do{
                str = br.readLine()

                if(str!=null){
                    buf.append(str)
                }
            }while (str!=null)
			
            // 전체가 객체로 묶여있기 때문에 객체형태로 가져옴
            var root = JSONObject(buf.toString())
            var address: String = root.getString("address")
            var count: Int = root.getInt("count")

			// 화면에 출력
            runOnUiThread {
                textView.append("address: ${address}\n")
                textView.append("count: ${count}\n\n\n")
            
            // 객체 안에 있는 stores라는 이름의 리스트를 가져옴
            var stores = root.getJSONArray("stores")
			
			// 리스트에 있는 데이터 중 100개만 읽어옴
            for(i in 0 until 100){
                var obj2 = stores.getJSONObject(i)

                var addr: String = obj2.getString("addr")
                var name: String = obj2.getString("name")
                var remain_stat: String = obj2.getString("remain_stat")
                var detail: String? = null

                if(remain_stat.contentEquals("plenty")){
                    detail = "100개 이상"
                }else if(remain_stat.contentEquals("some")){
                    detail = "30개 이상 100개 미만"
                }else if(remain_stat.contentEquals("few")){
                    detail = "2개 이상 30개 미만"
                }else if(remain_stat.contentEquals("empty")){
                    detail = "1개 이하"
                }else if(remain_stat.contentEquals("break")){
                    detail = "판매 중지"
                }
				
                // 화면에 출력
                runOnUiThread {
                    textView.append("판매처 주소: ${addr}\n")
                    textView.append("판매처 이름: ${name}\n")
                    textView.append("재고 상태: ${remain_stat} = $detail\n\n")
                }
            }
        }
    }
}
}

[실행 화면]

 

 

- 버튼을 누르면 아래와 같이 JSON문서에 있는 데이터를 가져와서 출력함

 

* 스크롤 뷰를 이용했기 때문에 화면을 스크롤하면 나머지 데이터들이 보임

 

'안드로이드' 카테고리의 다른 글

RxJava???  (0) 2021.02.06
웹툰 바로가기 앱  (0) 2020.05.24
오픈 API 데이터 가져오기(XML 문서)  (1) 2020.05.12
webView 사용해보기  (0) 2020.05.11
RecyclerView 사용법  (0) 2020.05.11
Comments