안드로이드에서 앱 내부에 저장된 JSON을 읽는 법

김흰돌·2024년 1월 5일
0

개발 중인 앱에서 지하철 역을 검색하면 지하철 좌표를 가져와야하는 상황이 생겼다.

HTTP 요청으로 지하철 역을 검색하면 좌표를 반환하는 API가 있을 거라 생각했지만 못 찾은 건지 그런 API는 나오지 않았다.

대신 국내 모든 지하철의 좌표를 가진 csv 파일을 구했고 이걸 json 형태로 바꾼 뒤 앱 내에 asstes 폴더에 넣어 좌표값을 구하고자 한다.

csv에서 json으로 변환하는 건 여길 이용했다.

지하철 좌표를 가진 데이터도 검색하면 금방 나온다.


asstes 폴더 생성하기


app 폴더를 우클릭하고 첨부한 사진대로 따라가면 된다.


생성한 폴더에 JSON 파일을 넣어주자.


asstes 폴더에서 json 불러오기

val assetManager = resources.assets
val inputStream = assetManager.open("SubwayStations.json")
val jsonString = inputStream.bufferedReader().use { it.readText() }
Log.e("데이터 확인", jsonString)

로그를 확인해보면

json 데이터를 잘 읽고 있는 걸 볼 수 있다.


JSON을 Data Class로 바꾸기

data class를 쉽게 만들기 위해 플러그인을 사용하면 편하다.

Settings로 들어가 Plugins 항목을 누르고 JSON To Kotlin Class를 검색하고 설치한다.



그리고 파일을 새로 만들기 위해 우클릭을 하면 우리가 설치한 플러그인이 나온다.



아까 로그에 찍힌 json 데이터의 일부를 복사해 넣어주고(배열 열고 닫는 부분 꼭 포함!) 파일 이름을 작성 후 생성하면,



이런 파일이 자동으로 생성된다.



혹시 Parcelize에 나오는 에러 표시를 해결하기 힘든 사람은 build.gradle 파일에 id("kotlin-parcelize")를 추가해준다.



그리고 json을 객체로 만들기 위해 Gson 라이브러리를 사용한다.


val assetManager = resources.assets
val inputStream = assetManager.open("SubwayStations.json")
val jsonString = inputStream.bufferedReader().use { it.readText() }

val gson = Gson()
val subwayStations: SubwayStationsEntity = gson.fromJson(jsonString, SubwayStationsEntity::class.java)

Gson 객체를 생성하고 fronJson 함수 파라미터에 json에서 가져온 값이 들어있는 jsonString 그리고 변환할 객체 타입을 넣어준다.



json에 2번째로 들어가있던 사평역이 잘 출력되는지 확인해보기 위해 로그를 찍어보자.


Log.e("데이터 확인", subwayStations.get(1).stationName)


잘 나오는 걸 확인해 볼 수 있다.


마무리

위 과정을 응용해 HTTP 통신으로 받아오기 힘든 데이터들을(서버를 만들어줄 친구가 없거나...🥲, 마땅한 API가 없거나, 작성자처럼 백엔드 지식이 없거나ㅎ) 앱 내에 저장하고 불러오는 방법을 사용하면 되겠다.

0개의 댓글