기어가더라도 제대로
[Swift-기초] String 타입을 JSON으로 디코딩하기(Entity, DTO) 본문
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")
}
1차 수정
생각보다 한 데이터 필드의 값이 여러타입인 경우가 있는 것을 알았다.
살다보면 여러 상황이 있으니까 너무 놀랄 필요는 없는 것 같다.
관련해서 잘 정리해놓은 벨로그 링크를 공유한다.
https://velog.io/@juyoung999/Decoding-JSON-With-Multiple-Types-Key
'Swift - 기초' 카테고리의 다른 글
[Swift-기초] 제네릭을 실전처럼 이용해보기 - generics (0) | 2022.11.12 |
---|---|
[Swift - 기초] Optional - 100 days of swiftUI (0) | 2022.10.04 |
[Swift-기초] Extension, protocol Extension - 100 days of SwiftUI (0) | 2022.10.02 |
[Swift - 기초] Protocol, Opaque return type(some) (0) | 2022.10.01 |
[Swift-기초] class - 100 days of swiftUI (2) | 2022.09.30 |
Comments