見出し画像

【SwiftUI】JsonDataの中に、Nilを含むDate型がある場合の対応

JsonDataの中に、Nilを含むDate型がある場合、普通にData型としてJson Dataをパースしようと、下記のようなエラーになる。



typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: 
[CodingKeys(stringValue: "finish", intValue: nil)], 
debugDescription: "Expected to decode Double but found a string instead.", 
underlyingError: nil))
データのフォーマットが正しくないため、読み込めませんでした。

JsonをDecodeすると、データは全てString型になるみたい。
そのため、まずやってみたのは、Jsonパースの際にDate型として定義してNilデータにも対応させるやり方。extension DateFormatterをFunctionを作って、Decodeする時に、


extension DateFormatter {
    /// ミリ秒付きのiso8601フォーマット e.g. 2019-08-22T09:30:15.000+0900
    static let iso8601Full: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()
}

しかし、Data型データ内にNilがあったため、エラーになる。
そのため、別の方法でStructの定義をStringとして、JsonDataもそのままDecodeする。
Structの定義の中に、Date Formatに変換できるように宣言する。
これで、パースエラーが解消された。
多分、他にも方法があるんだろうけど、とりあえずこれからはJsonデータは全部、String型で受け取ってからFormatterで調整していこうと思う。

    var usefulDateFormat: Date? {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-mm-dd"
        let newFinish = formatter.date(from: finish)
        return newFinish

SwiftUIは、データの種類とか、デバグの方法とか何かと自分で定義していかないと動いてくれないので、PHPみたいなゆるい畑からきた者にとっては、中々手強い相手のようです。まだデータの定義しかできてない。。。一歩ずつですね。先は長いので、少しずつ。。。と自分に言いきかす。

レファレンス
https://qiita.com/Riscait/items/ea5e40acd29939363a64
https://www.hackingwithswift.com/forums/swiftui/handling-unexpected-date-type-in-json-decoder/22160

いいなと思ったら応援しよう!