ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 스튜디오 JSON 사용하기
    Android Studio 2023. 7. 20. 19:32
    728x90

    JSON 이란?

    JavaScript Object Notation (JSON)은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷

     

    배열은 [] (대괄호) 로 표기
    내부에는 Key : Value 값들로 각 속성값을 정의
    Key 와 Value 는 : (콜론) 에 의해 구분되
    각각의 속성은 , (쉼표)로 구분

     

    예를 들어 http://api.nbp.pl/api/cenyzlota/last/30/?format=json

     

    해당 사이트를 확인해보면 

    [{"data": "2023-06-09","cena": 264.81},{"data": "2023-06-12","cena": 261.86},........]

    이런 식으로 저장된 것을 볼 수 있습니다.

    [] 이 뜻하는 것은 배열이며, {} 은 객체라고 생각하시면 됩니다.

     

    즉 해당 사이트에서 제공하는 json을 코틀린 으로 생각한다면

    data class Json (val data : String, val cena: Float) 형태의 클래스를 제네릭으로 가진 List 혹은 배열 이라고 생각하시면

    이해하기 쉽습니다.

     

    하기 내용에 사용한 JSON

    https://a.4cdn.org/boards.json

     

    해당 JSON은 객체 안에 리스트가 저장되어 있는 형태입니다.

     

    json 파일은 기본적으로 문자열 형태로 작성되어 있으며, 입력받을 경우 안드로이드 스튜디오에서 네트워크와 관련된 명령문들은 쓰래드을 이용하여 받아야 하기 때문에 thread 를 이용하여 해당 정보를 받아옵니다.

     

    1. 기본적인 방법

     

    받아오는 경우

    thread{
        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)
        bufferedReader.close()
    }

     

     

    다음으로는 받아온 자료에서 정보를 추출하는 방법입니다. 

    받아올 때 StringBuffer을 사용하여 json의 정보들을 저장하였습니다. 

     

    해당 정보들을 사용하기 위해서는 해당 JSON 가장 최상단의 형태로 받아야 합니다.

    해당 링크는 최상단을 보면 { 으로 시작하기에 객체인 것을 알 수 있기에 JSONObject 형태로 받습니다.

    [  인경우 JSONArray 형태로 받아줍니다.

     

    val data = stringBuffer.toString()
    
    val root = JSONObject(data)

     

    이제 root를 이용하여 JSON의 정보에 접근하겠습니다.

     

    JSON 구조

    {
    "boards": [
    {

    해당 JSON을 보면 [ 로 시작하여 JSONArray 로 받아야 한다는 점을 확인할 수 있습니다.

     

    JSON 에서 배열 받아오기

    val boards = root.getJSONArray("boards")

     

    JSON은 Map 처럼 키 - 값 형태로 되어 있기 때문에 자료형에 따라 getString(key), getInt(key), getJSONObject(key) 등을 사용합니다.

    다음은  배열에서 객체값을 추출하여 TextView에 추가해보겠습니다.

    화면과 관련된 부분은 쓰래드에서 처리를 할 수 없기 때문에 runOnUiThread를 이용하여 변경해야 합니다.

    for(i in 0 until boards.length()){
        val boardObj = boards.getJSONObject(i)
    
        val board = boardObj.getString("board")
        val title = boardObj.getString("title")
        val pages = boardObj.getInt("pages")
        val cooldowns = boardObj.getJSONObject("cooldowns")
        val threads = cooldowns.getInt("threads")
        val replies = cooldowns.getInt("replies")
        val images = cooldowns.getInt("images")
    
        runOnUiThread{
            textView.append("board : ${board}\n")
            textView.append("title : ${title}\n")
            textView.append("pages : ${pages}\n")
            textView.append("threads : ${threads}\n")
            textView.append("replies : ${replies}\n")
            textView.append("images : ${images}\n\n")
        }
    
    }

     

     

     

    2. 객체로 받기

     

    안드로이드 스튜디오에서 JSON을 분석하여 kotlin 의 data class을 만들어 주는 플러그인이 존재합니다.

     

    플러그인 사용 영상

     

     

    영상에 나왔듯이 JSON의 내용을 입력하면 해당 양식에 맞게 데이터 클래스를 생성해줍니다.

    생성된 데이터 클래스를 이용하여 데이터를 받는 과정은 하기와 같습니다.

     

    thread{
        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)
        bufferedReader.close()
    
    
        val gson = Gson()
        val data = stringBuffer.toString()
        val boards = gson.fromJson(data.reader().readText(), jsonTest::class.java).boards
    
        runOnUiThread {
            for(board in boards){
                textView.append("board : ${board.board}\n")
                textView.append("title :${board.title}\n")
                textView.append("pages :${board.pages}\n")
                textView.append("cooldowns.threads :${board.cooldowns.threads}\n")
                textView.append("cooldowns.images :${board.cooldowns.images}\n")
                textView.append("cooldowns.replies :${board.cooldowns.replies}\n\n")
            }
        }
    
    }

     

     

    Gson은 Java에서 Json을 파싱하고, 생성하기 위해 사용되는 구글에서 개발한 오픈소스입니다.

    Java Object를 Json 문자열로 변환할 수 있고, Json 문자열을 Java Object로 변환할 수 있습니다.

    gson.fromJson(data.reader().readText(), jsonTest::class.java)

    해당 구문은 쉽게 설명하자면 JSON으로 부터 data를 읽고(reader()) 문자열로 읽어와(readText) 그리고 jsonTest 형태의 클래스를 만들어라는 의미를 가지고 있습니다.

     

    GSON 을 이용하여 JSON 만들기

    INFO는 제가 만든 데이터클래스 이름입니다.

    val InfoList = mutableListOf<Info>()
    
    // 리스트에 내용 입력
    
    val gson = Gson()
    val g1 = gson.toJson(InfoList)

     

     

Designed by Tistory.