기어가더라도 제대로

[Swift-기초] String 타입을 JSON으로 디코딩하기(Entity, DTO) 본문

Swift - 기초

[Swift-기초] String 타입을 JSON으로 디코딩하기(Entity, DTO)

Damagucci-juice 2024. 9. 6. 20:52

Why

서버에서 API 응답값이 JSON 객체로 오지 않고 String으로 오는 경우가 있었다. 다행이 String의 내용은 일부만 손을 보면 JSON으로 변환이 가능한 수준이였다. (세상은 다양한 예측 불가능한 상황이 있다는 것을 배웠다. JSON도, XML도 아니고 String이라니) Swift에서 String으로 JSON을 만들어서 DTO로 만들어보자.

What

String을 iOS에서 쓰는 객체로 바꾸기 위해서는 중간 단계인 JSON으로 변환하는 과정이 필요하다. 단계별로 설명하자면
서버에서 String을 응답으로 받고, (필요하다면 약간의 수정을 거쳐) 이를 JSON으로 변환한 후 struct로 디코딩한다.

How

// MARK: - 최종적으로 바꾸고 싶은 타입
struct Person: Codable {
    let name: String
    let age: Int
}

// MARK: - 간단한 서버 응답 -> JSON
let stringResponse = "{\"name\": \"Damagucci-Juice\", \"age\": 30}"
let data = stringResponse.data(using: .utf8)!
if let jsonResult = try? JSONSerialization.jsonObject(with: data,
                                                      options : .allowFragments) as? Dictionary<String, Any> {
    print(jsonResult)                  // ["name": Damagucci-Juice, "age": 30]
} else {
    print("Bad JSON")
}

// MARK: - 간단한 서버 응답 -> Entity
let stringResponse = "{\"name\": \"Damagucci-Juice\", \"age\": 30}".data(using: .utf8)!
if let person = try? JSONDecoder().decode(Person.self, from: stringResponse) {
    print("이름: \(person.name)")        // 이름: Damagucci-Juice
    print("나이: \(person.age)")         // 나이: 30
} else {
    print("Decoding Fail")
}
Comments