본문 바로가기
iOS📱/Swift

[Swift] Json Parsing ( JsonSerialization vs Codable )

by 텅빈비니 2024. 2. 23.
반응형

안녕하세요🐶

빈지식 채우기의 비니🙋🏻‍♂️입니다.

 

오늘은 Json 다루기에 대해 알아보도록 할건데요!

대표적으로 2가지를 뽑을 수 있습니다.

JsonSerializationCodable 

자세히 알아보도록 하겠습니다!


1. JsonSerialization

JsonSerialization 정의

Json 과 Equivalent Foundation Object 사이에 변환을 담당하는 객체입니다.

여기서 말하는 Equivalent Foundation Object 란,

Array 와 Dictionaray 입니다.

.

.

고로 Json > Array or Dictionary 또는 Array or Dictionary > Json 으로 변환해주는 객체라고 볼 수 있습니다.

우리는 정의되어있는 메서드 중 data, jsonObject 를 주로 사용하고 있습니다.

.

그럼 어떻게 쓰냐..? 바로 예시를 통해 알아보도록 하겠습니다.

 

1-1. JsonObject()

func stringToJson() {
	// Dictionary String 정의
    let str = "{\"names\": [\"Sean\", \"Endrew\"]}"
    let data = Data(str.utf8)

    do {
    	// Dictionary to Json 변환
        if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            if let names = json["names"] as? [String] {
                print(names)
            }
        }
    } catch let error as NSError {
        print("Failed to load: \(error.localizedDescription)")
    }
}

  • Json Dictionary 가 유효하지 않으면 Json 변환이 실패하므로, Try/Catch를 사용하여 오류 처리가 필요합니다.
  • Json 내부에는 어떠한 값이 있는지 모르니까 조건부로 값을 확인하여 매핑해야 합니다. ( ex. as? [String] )

 

1-2. data()

func jsonToArray() {
	// Dictionary 선언
    let dic: [String: Any] = [
        "names": ["Sean", "Endrew"]
    ] as Dictionary

    do {
    	// Dictionary to data 변환
        let arrayJson = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)
        print(String(data: arrayJson, encoding: .utf8) ?? "")
    } catch {
        print(error.localizedDescription)
    }
}

  • data 화 과정에서 오류가 날 수 있으므로, Try/Catch를 사용하여 오류 처리가 필요합니다.
  • data 형태로 변환 후 String 객체 메서드를 통해 String 변환을 합니다.

2. Codable

Codable 정의

  • Decodable 과 Encodable 프로토콜을 사용할 수 있는 타입입니다.
  • Codable을 통해 변환하고 싶은 구조체를 만들고, JsonDecoder을 통해 디코딩할 수 있습니다.
// Codable 정의
struct name: Codable {
    let name: String?
}

func codableTest() {
    do {
    	// API 및 그외 통신으로 부터 받은 값에 대해 Decode 진행
        let name = try JSONDecoder().decode(name.self, from: data)
    } catch {
        print(error.localizedDescription)
    }
}
  • Codable 프로토콜을 상속받는 name 구조체를 설정합니다.
  • 이후 통신으로부터 받은 Response 값을 JsonDecoder을 통해 name 구조체와 매핑시킵니다.

여기서 주의❗️

위에 name의 경우 String 으로 선언하였으나,

넘어오는 값이 String 타입이 아닐 경우, 오류가 발생하여 catch 문구로 빠지게 됩니다.

반드시 변수 타입이 같게 설정해야 합니다.



3. 결론

  JsonSerialization Codable
특징 1. jsonObject(), data() 메서드를 통해 값의 변환이 가능하다.

2. 변환된 값 안에 어떠한 값 또는 타입인지 알 수 없다.
1. Codable 프로토콜을 상속받는 구조체를 설정한다.

2. jsonDecoder() 을 통해 생성한 구조체에 Response 값을 매핑시킬 수 있다.
주의해야할 점 값의 유무와 타입을 알 수 없기 때문에, 일일히 값을 매칭시켜 변환하여 사용해야 한다. 생성한 Codable 구조체 내 변수 타입와 매핑되는 값의 타입이 반드시 같아야 한다.

 

그냥 ... Codable ... 쓰세요..


감사합니다!


참고

반응형