hyeals study
오픈 API 데이터 가져오기(JSON 문서) 본문
- 공공 데이터 포털에서 오픈 API인 주소 기준 동네별 공적 마스크 판매정보 제공 서비스(https://www.data.go.kr/data/15057411/openapi.do)를 이용해서 데이터를 가져오는 연습을 할 것
- URL을 누르면 아래와 같은 창이 뜸
- 위 사진에 나와있는 URL 주소에 들어가면, 아래와 같은 JSON문서가 나옴
◎ 여기서 가져올 데이터 목록
- address: 주소
- count: 조회 데이터 개수
- addr: 판매처 주소
- name: 판매처 이름
- 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