#はじめに
現在開発中のiPhoneアプリにて、WebAPIをリクエストし、jsonを取得し、Codableを使用して任意のモデルに変換しようとしており、その際に起こった問題です。
#問題
デバイスによって、
The data couldn't be read because it isn't in the correct format.
error が返されます。
下記のようなJSONを取得し
"hoges": [ { "name": "hogehoge", "link": "google.co.jp", "thumbnail": "hoge.jpg", "pubdate": "Fri, 15 Feb 2019 10:00:10 +0900" } { ..... ]
こちらのデータを変換するために下記のようなコードを書いています。(必要な箇所だけ書いてます)
class HogeManager { static func createModel() { APIClient.request(path: .hoge, completionHandler: { (str, err) -> (Void) in guard let str = str else { return } do { let data = str.data(using: .utf8)! let decoder = JSONDecoder() decoder.dateDecodingStrategy = .formatted({ return eeeddMMMyyyyFormatter }()) let hoges = try decoder.decode([Hoge].self, from: data) } catch let err { } }) } } public let eeeddMMMyyyyFormatter: DateFormatter = { let formatter: DateFormatter = DateFormatter() formatter.dateFormat = "EEE, dd MMM yyyy hh:mm:ss Z" return formatter }() class Hoge : Decodable { var name: String? var link: String? var thumbnail: String? var publishDate: Date? //Format: EEE, dd MMM yyyy hh:mm:ss private enum CodingKeys: String, CodingKey { case name case link case thumbnail case publishDate = "pubdate" } }
自分が使用している実機iPhone 8 (iOS 12.2) では、上記のエラーが起きず正常にモデルへの変換ができましたが、同バージョンのシミュレータiPhoneXやiPhone8、現在の最新バージョンのiPhoneX実機では、モデルへ変換することができず上記のerrorが表示されます。
日本語、英語などのデバイスの言語の違いを調べましたが、そちらには依存しないようで、現状どこが原因かわかりません。どなたかアドバイスいただける方いらっしゃいましたら、お願いいたします。m(_ _)m
#追記
上記の内容に誤りがあるので、追記します。
任意のクラスでAlamofireを使って、Stringでレスポンスを受け取り、そのStringをDataクラスに変換し、JSONDecoderを使用して、任意のモデルに変換しています。
モデルにおけるDate関連のプロパティを外すと、変換できていることはわかっていまして、現在その部分を調査中です。
class APIClient { static func request() { AF.request(url, method: .get, headers: headers, interceptor: nil).responseString { (response) in switch(response.result) { case .success(_): print("success reuest:::(String(describing: response.request))") guard let resultStr = response.result.value else { completionHandler(nil, APIError.jsonParseError) return } completionHandler(resultStr, nil) case .failure(let error): print("failure request:::(String(describing: response.request))") completionHandler(nil ,error) } } } }
回答1件
あなたの回答
tips
プレビュー