자바스크립트에서는 JSON 파일이 정말 편리하고 좋았는데 iOS에서는 바로 사용을 할 수 없다니 충격이었습니다.
아무튼... struct를 이용해 사용할 JSON 처럼 만들고 변환해 사용해야 합니다.
(참고로 JSON을 그대로 Print 해봤더니 byte 크기만 출력 되었습니다.)
1. 구조 잡기
2. 디코딩
다음과 같은 JSON을 가지고 왔다고 가정하고 이를 iOS에서 사용해 보겠습니다.
{
"Sample1": 1,
"Sample2" {
"Sample2-1": "sm2-1",
"Sample2-2": 22
}
"Sample3": [
{
"Sample3-1": "sm3-1",
"Sample3-2": 32
}
]
}
이러한 JSON은 Swift struct로 다음과 같이 표현할 수 있습니다.
1. 구조 잡기
Codable 프로토콜을 채택해 주어야 하는데 이는 구조체가 변환될 수 있도록 하기 위해 채택해 주어야 합니다.
(encoding, decoding에 사용)
struct Samples: Codable {
let Sample1: Int
let Sample2: SampleTwo // JSON 처럼 연결 1
let Sample3: [SampleThree] // JSON 처럼 연결 2
}
// JSON 처럼 연결 1
struct SampleTwo: Codable {
let Sample2-1: String
let Sample2-2: Int
}
// JSON 처럼 연결 2
struct SampleThree: Codable {
let Sample3-1: String
let Sample3-2: Int
}
기본적으론 이렇게 JSON과 같은 KEY를 사용하면 됩니다.
만약 내가 원하는 이름의 Key를 사용하려면 다음과 같이 열거형을 추가해 주면 됩니다.
위와 같은 코드에서 Sample1 만 Transfrom1로 바꿔보도록 하겠습니다.
struct Samples: Codable {
let Transform1: Int
let Sample2: SampleTwo // JSON 처럼 연결 1
let Sample3: [SampleThree] // JSON 처럼 연결 2
// 여기를 보세요!
enum CodingKeys: String, CodingKey {
case Transfrom1 = "Sample1" // 원하는 Key 맵핑
case Sample2
case Sample2
}
// JSON 처럼 연결 1
struct SampleTwo: Codable {
let Sample2-1: String
let Sample2-2: Int
}
// JSON 처럼 연결 2
struct SampleThree: Codable {
let Sample3-1: String
let Sample3-2: Int
}
2. 디코딩
이제 틀을 만들었으니 받아온 JSON을 decoding하여 iOS에서 사용할 수 있는 형태로 만들어 보겠습니다.
방법은 간단합니다.
// Json decording 하기
// data는 받아온 JSON이라 가정합니다
// 디코더 만들기
let decoder = JSONDecoder()
// 첫번째 인자는 Json 형태로 만든 // data - 서버에서 받은 json
guard let samples = try? decoder.decode(Samples.self, from: data) else {return}
* 추가 - JSON에 배열이 섞여 있을때
이것 때문에 애를 좀 먹었습니다..
해결 방법은 간단합니다.
1. JSON의 시작이 [ ] 일때
예를 들어 처음 JSON 예시에서 [ ]로 시작할 때 입니다.
// 가장 바깥 부분이 [ ] 입니다.
[
"Sample1": 1,
"Sample2" {
"Sample2-1": "sm2-1",
"Sample2-2": 22
}
"Sample3": [
{
"Sample3-1": "sm3-1",
"Sample3-2": 32
}
]
]
이때는 디코딩을 할 때 Samples.self -> [Samples].self로 해주시면 됩니다. 다음과 같습니다.
// Json decording 하기
// data는 받아온 JSON이라 가정합니다
// 디코더 만들기
let decoder = JSONDecoder()
// 첫번째 인자는 Json 형태로 만든 // data - 서버에서 받은 json
guard let samples = try? decoder.decode([Samples].self, from: data) else {return}
2. Sample3 처럼 중간에 [ ]가 섞여 있을때
A.B.C 처럼 바로 접근을 할 수 없고 배열에 접근한 후에 사용해야 합니다.
배열의 .first를 사용한 예제입니다.
if let sample = samples.Sample3.first {
// 이제 다시 .로 접근이 가능합니다.
sample.Sample3-1
}
+ json parsing 라이브러리도swiftyJson이라는 라이브러리가 있다고 하는데 추후에 공부해야겠습니다.
'iOS > Swift' 카테고리의 다른 글
[iOS] 파이어베이스 구글 로그인 인증(firebase google login) (0) | 2022.02.12 |
---|---|
[iOS] cocoaPod으로 라이브러리 사용 (0) | 2022.02.11 |
[iOS] iOS HTTP 통신 허용 방법 (0) | 2022.02.09 |
[IOS] UICollectionView 기본 사용 (0) | 2022.02.07 |
[IOS] 이벤트 관찰 NotificationCener (0) | 2022.02.07 |