본문 바로가기

안드로이드 앱 스쿨 2기/Android

[13주차 - 화] JSON 문서

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")
                        }
                    }

                }
            }
        }


    }

}

 

 

https://api.nationalize.io/?name=michael 의 json 파일 형태

 

 

 


[결과]

 

 

 

 

출처 : 안드로이드 앱스쿨 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