iOS/Swift

[iOS] iOS에서 JSON 파일 사용하는 방법

유훈 | Yuhun 2022. 2. 9. 20:00
반응형

자바스크립트에서는 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이라는 라이브러리가 있다고 하는데 추후에 공부해야겠습니다.

 

 

 

반응형