[안드로이드] Json 파싱

hee09·2021년 11월 24일
0
post-thumbnail

참조
안드로이드 developer - JSONObject
위키피디아 - JSON
깡쌤의 안드로이드 프로그래밍

틀린 부분 댓글로 남겨주시면 수정하겠습니다..!!

Json

JSON은 "속성-값 쌍" 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷입니다. 비동기 브라우저/서버 통신(AJAX)를 위해, 넓게는 XML(AJAX가 사용)을 대체하는 주요 데이터 포맷입니다. 안드로이드에서 JSON 파싱은 JSONObject 클래스와 JSONArray 클래스를 이용합니다.

JSON 예시

{
    "이름": "홍길동",
    "나이": 25,
    "성별": "여",
    "주소": "서울특별시 양천구 목동",
    "특기": ["농구", "도술"],
    "가족관계": {"#": 2, "아버지": "홍판서", "어머니": "춘섬"},
    "회사": "경기 수원시 팔달구 우만동"
 }

JSON은 앞서 말했듯이 "속성-값" 또는 "키-값"으로 이루어졌습니다. 위의 예제는 한 사람의 정보에 관한 JSON 객체인데 키-값 쌍의 패턴으로 표현되어 있습니다.
(이름 - 홍길동, 나이 - 25 등...)

JSONObject, JSONArray

JSON

JSON 구조

안드로이드에서 JSONObject는 JSON의 { }로 묶이는 부분의 내용을 나타내기 위한 클래스이며, JSONArray JSON의 [ ]로 묶이는 부분의 내용을 표현하기 위한 클래스입니다. [ ]의 표현식은 그 안에 { }을 여러 개 포함할 수 있는 형태로 { } 하나가 JSONObject 객체로 표현되고, 이 JSONObject 객체 여러 개를 담기 위한 객체가 JSONArray입니다.

위의 예시에서는 { }로 이루어진 B는 JSONObject에 해당하는 것이고, [ ]로 이루어진 A는 JSONArray에 해당합니다.

JSON 데이터 파싱

Json 파일

{
  "weather": [
    {
      "id": 721,
      "main": "Haze",
      "description": "haze",
      "icon": "50n"
    }
  ],
  "main": {
    "temp": 10.14,
    "pressure": 1020,
    "humidity": 37,
    "temp_min": 6,
    "temp_max": 13
  },
  "id": 1835848,
  "name": "Seoul",
  "cod": 200
}

JSON 데이터를 파싱하는 간단한 코드

try {
    // assets 폴더안에 있는 JSON 파일을 열어 InputStream 객체 생성
    val inputStream = assets.open("test.json")
    // 한번에 읽을 수 있는 사이즈
    val size = inputStream.available()
    // Byte 배열 생성
    val buffer = ByteArray(size)
    // InputStream으로 부터 들어온 데이터 읽고 buffer에 저장
    inputStream.read(buffer)
    // InputStream close
    inputStream.close()
    // String으로 변환
    val json = String(buffer, charset("UTF-8"))

    // JSONObject 객체 생성(최상위 JSON 객체)
    val jsonRoot = JSONObject(json)
    
    // JSONArray 획득
	val jsonArray = jsonRoot.getJSONArray("weather")

    // jsonRoot 객체 하위에 데이터 획득
    cityView.text = jsonRoot.getString("name")
    // jsonRoot 객체 하위에 JSONObject 획득
    val jsonMain = jsonRoot.getJSONObject("main")
    // jsonMain 객체 하위에 데이터 획득
    temperatureView.text = jsonMain.getString("temp")
} catch(e: Exception) {
    e.printStackTrace()
}

위의 코드는 다음과 같습니다.

  1. JSONObject에 파싱할 JSON 문자열을 대입하면 최상위 JSONObject 객체가 생성됩니다(위의 예시에서 JSONObject(json) 코드)
  2. 생성된 최상위 JSONObject의 하위에는 JSONObject 혹은 JSONArray 객체 여러 개가 생성됩니다.
  3. 필요한 데이터를 getter를 사용하여 획득하면 되는데 위의 코드에서는 우선 JSONObject.getJSONArray를 사용하여 weather이라는 키에 해당하는 JSONArray 객체를 획득합니다.
  4. 그 후 JSONObject.getString() 메서드를 이용하여 최상위 JSONObject의 name이라는 json의 키에 해당하는 값을 획득합니다.
  5. 그 후 최상위 JSONObject 하위에 JSONObject를 획득하는데 그 키가 main이므로 JSONObject.getJSONObject("main")을 이용합니다.
  6. 마지막으로 main이라는 JSONObject의 temp 키에 해당하는 값을 획득하기 위해 JSONObject.getString()을 사용합니다.

이외에도 여러 getter 함수가 존재합니다.

  • get(String name): name에 매핑되는 value 반환
  • getBoolean(String name): name에 매핑되는 boolean value 반환
  • getDouble(String name): name에 매핑되는 double value 반환
  • getInt(String name): name에 매핑되는 int value 반환
  • getJSONArray(String name): name에 매핑되는 JSONArray 반환
  • getJSONObject(String name): name에 매핑되는 JSONObject 반환
  • getLong(String name): name에 매핑되는 long value 반환
  • getString(String name): name에 매핑되는 string value 반환

예제 코드

profile
되새기기 위해 기록

0개의 댓글