前提・実現したいこと
今週からSwiftでアプリ開発をはじめたsharmanと言います。
APIからJson形式でデータを取得するのですが、そのAPIの処理結果がOKの時と、NGの時とで特定の項目のみ、オブジェクトか文字列かで型が異なります。
OK:オブジェクトが返ってくるため、それに合わせたクラスの型
NG:空文字
OKの時↓
Json
1{"result": { 2 "message": "", 3 "response": { 4 "data":[{ 5 "xxx": "xxx", 6 "yyy": "yyy" 7 }] 8 }, 9 "status": "OK" 10 } 11}
NGの時↓
Json
1{"result": { 2 "message": "エラーメッセージ", 3 "response": "", 4 "status": "NG" 5 } 6}
responseが、APIの結果がOKの時は処理結果の情報をオブジェクトで返し、NGの時は空文字を入れてきます。
受け取り側では、
Swift
1struct Response: Codable { 2 let result: Result 3 4 struct Result: Codable { 5 let message: String 6 let response: Response 7 let status: String 8 9 struct Response: Codable { 10 let xxx: String 11 let yyy: String 12 } 13 } 14}
のようなクラスを用意し、
Swift
1let json = try decoder.decode(Response.self, from: data)
でデコードしてます。
NGの時にデコードしようとすると以下のエラーが出ます。
エラーメッセージ typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "result", intValue: nil), CodingKeys(stringValue: "response", intValue: nil)], debugDescription: "Expected to decode Dictionary<String, Any> but found a string/data instead.", underlyingError: nil))
OKの時もNGの時もResponseクラスを使って対応はできないでしょうか?
デコード時に、responseが空文字か否かで処理を分けられないかと、
enumを使った方法など調べたのですが、私の場合に当てはまらずうまくいきませんでした。
初歩的なことかもしれませんが、ご教示いただけますでしょうか。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/16 10:20 編集
2019/10/16 12:46
2019/10/17 02:13
2019/10/17 03:03
2019/10/17 06:28