-
안드로이드 스튜디오 JSON 사용하기Android Studio 2023. 7. 20. 19:32728x90
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)
'Android Studio' 카테고리의 다른 글
AVD Error while waiting for device 해결법 (1) 2023.12.18 안드로이드 스튜디오 Retrofit (0) 2023.08.10 FireBase RealTime Database셋팅 및 기초 사용법 (0) 2023.08.03 안드로이드 스튜디오 WorkManager (0) 2023.07.26 back 버튼 두 번 클릭하여 프래그먼트에서 액티비티 종료시키기 (0) 2023.07.10