Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- tableView
- 클린 코드
- 리펙토링
- RxCocoa
- ios
- 애니메이션
- clean architecture
- uiscrollview
- Xcode
- rxswift
- UICollectionView
- UITextView
- Observable
- SWIFT
- swift documentation
- Protocol
- 리펙터링
- ribs
- Refactoring
- Clean Code
- uitableview
- HIG
- map
- Human interface guide
- 스위프트
- MVVM
- swiftUI
- combine
- 리팩토링
- collectionview
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] JSON 문자열 날짜, snake_case 디코딩 (JSON Decoding, Strategy) 본문
iOS 기본 (swift)
[iOS - swift] JSON 문자열 날짜, snake_case 디코딩 (JSON Decoding, Strategy)
jake-kim 2022. 4. 13. 23:00사전 지식) string to date 형변환 방법
- DateFormatter 인스턴스를 사용하여 문자열을 어떤 형태의 날짜 형태로 만들것인지 명시
- DateFormatter 인스턴스로 string을 date로 변환
let dateString = "2022-04-11T15:25:47.929Z"
let dateFormatter = DateFormatter()
dateFormatter.locale = .init(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
if let date = dateFormatter.date(from: dateString) {
print(date) // Date 타입 2015-05-15 21:58:00 +0000
}
snake_case to camelCase 디코딩
- 데이터
- snake_case 키값으로 오는 값들을 model에서는 codingKeys 없이 자동으로 디코딩해야하는 상황
let json = """
{ "today_date": "2022-04-11T15:25:47.929Z" }
"""
struct MyDate: Codable {
let todayDate: String?
}
- decoder 구현
- JSONDecoder 인스턴스의 `keyDecodingStrategy` 속성에 .convertFromSnakeCase를 입력하여 사용
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
guard let data = json.data(using: .utf8) else { fatalError() }
let myDate = try decoder.decode(MyDate.self, from: data)
print(myDate)
// MyDate(todayDate: Optional("2022-04-11T15:25:47.929Z"))
} catch {
print(error)
}
날짜 string을 Date 형으로 디코딩
- 데이터
- String타입으로 오는 날짜 값을 Date형으로 변환
import UIKit
let json = """
{ "today_date": "2022-04-11T15:25:47.929Z" }
"""
struct MyDate: Codable {
let todayDate: Date? // <-
}
- 모델에서의 타입이 Date형이지만 json에는 string형으로 응답이 오는 경우 처리
- decoder 형을 새로 정의해야하므로 throw할 수 있는 DateError 타입 정의
- JSONDecoder()의 dateDecodingStrategy라는 프로퍼티에 .custom에서 decoder 형을 정의
enum DateError: Error {
case invalidDate
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
let container = try decoder.singleValueContainer()
let dateStr = try container.decode(String.self)
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
if let date = formatter.date(from: dateStr) {
return date
}
throw DateError.invalidDate
})
do {
// guard let data = json.data(using: .utf8) else { fatalError() }
guard let data = json.data(using: .utf8) else { fatalError() }
let myDate = try decoder.decode(MyDate.self, from: data)
print(myDate) // // MyDate(todayDate: Optional(2022-04-11 15:25:47 +0000))
} catch {
print(error)
}
* 참고
https://stackoverflow.com/questions/46537790/iso8601-date-json-decoding-using-swift4
'iOS 기본 (swift)' 카테고리의 다른 글
Comments