[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Swift

[Swift] JSON Encoding / Decoding

inu 2022. 5. 12. 21:53
반응형

JSON Encoding / Decoding

JSON

  • JavaScript Object Notation의 약자입니다.
  • 네트워크를 통해 데이터를 주고받을 때 사용되는 표준 포맷입니다.
  • 우리는 Swift 데이터를 JSON 데이터로 변환하고, JSON 데이터를 Swift 데이터로 변환할 필요가 있습니다. 이를 Encoding 및 Decoding이라고 합니다.
  • Dictionary와 같이 Key-Value 형태를 가지며, 전체 데이터가 일반 Text로 구성되어 있습니다.

JSONEncoder(Decoder)

let encoder = JSONEncoder()
do {
    let jsonData = try encoder.encode(instance)
} catch {
    print(error)
}
let decoder = JSONDecoder()
do {
    let instance = try decoder.decode(Instance.self, from: jsonData)
} catch {
    print(error)
}
  • Swift에서 제공하는 JSONEncoder 및 JSONDecoder는 모든 객체를 JSON 형식으로 변환해줍니다.
  • 단, 주어진 객체가 Encodable 및 Decodable 프로토콜 (Codable)을 채택하고 있어야 합니다. (cf. Codable?)

JSONEncoder(Decoder) 설정변경

encoder.outputFormatting = .prettyPrinted // 출력 줄바꿈 설정
  • 원할 경우 JSONEncoder의 OutputFormatting 설정을 변경해 출력 줄바꿈 및 순서를 변경할 수 있습니다.
encoder.keyEncodingStrategy = .convertToSnakeCase // SnakeCase로 변경
  • key를 Encoding하는 스타일도 변경할 수 있습니다.
decoder.keyDecodingStrategy = .convertToSnakeCase // SnakeCase로 변경
  • key를 Decoding하는 스타일도 변경할 수 있습니다.
  • 이외에도 다양한 설정이 존재합니다. 자세한 내용은 공식문서를 참고해주세요!!

+datedecodingstrategy

  • Date 타입의 값을 decoding하는 경우 지정된 포맷과 맞지 않으면 정상적으로 데이터를 Decoding하지 못합니다.
  • 이럴 때 활용할 수 있는 것이 decoder의 속성인 datedecodingstrategy입니다.
  • 기본적으로 제공하는 다양한 Format이 존재합니다.

  • 기본적으로 제공되는 Format 중 적절한 것이 없다면 Custom Format를 사용합니다.
let decoder = JSONDecoder()

decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
​​​​let container = try decoder.singleValueContainer()
​​​​let dateStr = try container.decode(String.self)

​​​​let formatter = ISO8601DateFormatter()
​​​​formatter.formatOptions = [.withFullDate, .withTime, .withDashSeparatorInDate, .withColonSeparatorInTime]
​​​​return formatter.date(from: dateStr)!
})
  • 이처럼 formatter를 통해 date값을 가져올 수 있습니다.
반응형

'🍎 Apple > Swift' 카테고리의 다른 글

[Swift] URL Loading System  (0) 2022.05.12
[Swift] CodingKeys / Custom CodingKeys  (0) 2022.05.12
[Swift] ATS (App Transport Security)  (0) 2022.05.12
[Swift] 순열과 조합 구현  (2) 2022.04.25
[Swift] Queue (Deque) 구현  (0) 2022.04.25