JSON 문서
- JavaScript Object Notation의 약자로 JavaScript 언어에서 객체를 표현하는 문법을 사용해 데이터를 표현하는 비 표준 문서이다.
- 다양한 데이터 타입을 표현할 수 있어 많이 사용하는 문서 양식이다.
- 정수 : 100
- 실수 : 11.11
- 문자열 : “문자열“
- 객체 : { }
- 배열 : [ ]
- 논리 : true, false
1. AndroidMainfest.xml
- 인터넷 권한 추가하기
<uses-permission android:name="android.permission.INTERNET"/>
2. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="서버 접속" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
</LinearLayout>
</ScrollView>
</LinearLayout>
3. MainActivity
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
val serverAddress = "https://api.nationalize.io/?name=michael"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run{
button.setOnClickListener {
thread {
// URL 객체 생성
val url = URL(serverAddress)
// 접속 후 스트림 추출
val httpURLConnection = url.openConnection() as HttpURLConnection
val inputStreamReader = InputStreamReader(httpURLConnection.inputStream, "UTF-8")
val bufferedReader = BufferedReader(inputStreamReader)
var str:String? = null
val stringBuffer = StringBuffer()
// 문서의 마지막까지 읽어온다.
do{
str = bufferedReader.readLine()
if(str != null){
stringBuffer.append(str)
}
}while(str != null)
val data = stringBuffer.toString()
runOnUiThread {
textView.text = ""
}
// JSON 데이터 분석
// { } : JSONObject, 이름 - 값 형태
// [ ] :JSONArray, 0부터 1씩 증가하는 순서값을 가지고 관리
// 100 : 정수
// 11.11 : 실수
// "문자열" : 문자열
// true, false : 논리형
// 최 상위가 { } 이므로 JSONObject를 생성한다.
val root = JSONObject(data)
// count
val count = root.getInt("count")
// name
val name = root.getString("name")
runOnUiThread {
textView.text = "count : ${count}\n"
textView.append("name : ${name}\n")
}
// country
val countryArray = root.getJSONArray("country")
for(idx in 0 until countryArray.length()){
// idx 번째 JSONObject를 추출한다.
val countryObject = countryArray.getJSONObject(idx)
// country_id 를 추출한다.
val country_id = countryObject.getString("country_id")
// probability 를 추출한다.
val probability = countryObject.getDouble("probability")
runOnUiThread {
textView.append("country_id : ${country_id}\n")
textView.append("probability : ${probability}\n\n")
}
}
}
}
}
}
}
[결과]
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님
'안드로이드 앱 스쿨 2기 > Android' 카테고리의 다른 글
[12주차 - 금] 9 patch 이미지 (0) | 2023.07.14 |
---|---|
[11주차 - 수] SQLIteDataBase (0) | 2023.07.06 |
[11주차 - 수] Assets (0) | 2023.07.05 |
[11주차 - 수] Raw (0) | 2023.07.05 |
[11주차 - 화] FileStream (0) | 2023.07.04 |