배경
공공데이터 포털에 있는 오픈API를 활용하여 프로젝트를 만들던중 관광지검색을 위해 지역코드를 Key값으로 넣어줘야하는 상황이였습니다. 지역코드는 HTTP통신을 통해 불러오는게 아니라 따로 엑셀파일을 제공해줘서 이를 사용해보고자합니다!
이런식으로 제공해줬는데.. 데이터가 200개가 넘어가는 많은 데이터량입니다.
이를 JSON형식으로 바꾸자니 엄청난 노가다가 예상되어 그냥 복사붙여넣기 후 변수로 지정한다음 데이터 가공하여 배열로 담아주었습니다.
var text = """
11 서울특별시 11110 종로구
11 서울특별시 11140 중구
11 서울특별시 11170 용산구
11 서울특별시 11200 성동구
....
...
....
"""
// 텍스트가 저장된 변수를 배열에 담기
func uploadData() {
var array = text.components(separatedBy: "\n")
for element in array {
let arr = element.components(separatedBy: " ")
for j in 12..<arr.count {
data.append(LocationDataModel(areaName: arr[4], signguName: arr[j], areaCode: Int(arr[0])!, signguCode: Int(arr[8])!))
}
}
}
이 방법을 썼더니.. 한 소스코드파일의 길이가 엄청 길어져서 불편한 상황이 생겼습니다.
이건 너무 비효율적이다 싶어서 JSON형식으로 변환하여 사용하기로 했습니다.
XLS -> JSON 형식변환
저것을 일일히 형식으로 바꿔주기엔 너무 많은 시간이 걸리므로 해당 형식을 JSON형식으로 변환해주는 사이트를 발견했습니다.
https://shancarter.github.io/mr-data-converter/
Mr. Data Converter
shancarter.github.io
XLS에 저장된 변수명을 포함하여 복사 붙여넣기 해주면JSON 형식으로 변환해줍니다!
이대로 사용해도 좋지만 가독성 좋게 다시 변환해보려고 합니다!
http://json.parser.online.fr/beta/
Json Parser Online
json.parser.online.fr
위 사이트에서는 JSON형식으로 가독성 있게 변환해줍니다
이제 변환된 JSON형식을 사용해보겠습니다.
Xcode에서 json파일 만들기
다른 IDE에서 json파일로 만들고 프로젝트에 넣어도 되지만 Xcode에서도 직접 만들 수 있습니다.
1. 새로운파일을 선택해서 string을 검색 -> Strings File
2. 파일명과 확장자를 json으로 변경하고 Create -> Use .json을 선택해줍니다.
3. 완성된 JSON파일에 이전에 변환했던 JSON형식 데이터를 붙여넣어줍니다.
여기까지 JSON파일이 완성되었습니다.
주의할점은 JSON파일이 만들어졌지만 위 주석처리된 문장들을 모두 지워주셔야 디코딩 형식 오류가 나지 않습니다.
이제 JSON데이터를 불러와 디코딩하는 과정까지 보겠습니다
1. JSON형식과 맞는 데이터모델을 구성
struct LocationModel: Decodable {
let data: [LocationDataModel]
}
struct LocationDataModel: Decodable {
let areaName: String
let sigunguName: String
let areaCode: Int
let sigunguCode: Int
enum CodingKeys: String, CodingKey {
case areaName = "areaNm"
case sigunguName = "sigunguNm"
case areaCode = "areaCd"
case sigunguCode = "signguCd"
}
}
2. JSON파일을 불러오는 코드를 작성해줍니다.
// 데이터 불러오기
func load() -> Data? {
// 파일이름
let fileName = "AreaCode"
// 파일 확장자
let fileType = "json"
// 파일 위치
guard let fileLocation = Bundle.main.url(forResource: fileName, withExtension: fileType) else { return nil }
// 해당 파일을 Data로 변환
do {
let data = try Data(contentsOf: fileLocation)
return data
} catch {
return nil
}
}
3. 불러온 Data를 디코딩해줍니다.
// 디코딩
func decode(data: Data?) -> [LocationDataModel] {
// 데이터를 잘 받았는지 확인
guard let data = data else { return [] }
do {
// 지정한 데이터모델로 디코딩
let decoded = try JSONDecoder().decode(LocationModel.self, from: data)
return decoded.data
} catch {
return []
}
}
4. 결과
정상적으로 디코딩되어 배열에 저장되었습니다!
디코딩 형식 오류로 시간을 잡아먹었는데 변수명, null처리, json 위 주석문장 제거 필히 확인하는게 좋습니다.
'iOS' 카테고리의 다른 글
[iOS][버그해결] 이중으로 들어간 CollectionViewCell안 CollectionViewCell이 재사용되는 버그 (0) | 2024.11.16 |
---|---|
[iOS] Alamofire 문서번역 (0) | 2024.11.06 |
[iOS][버그 해결] TableViewCell안에 Lottie애니메이션 재생오류 (0) | 2024.08.23 |
[iOS]UserDefaults 사용해보기 (0) | 2024.08.18 |
Clean Architecture and MVVM on iOS 글 번역 (3) | 2024.08.12 |