2017-12-24 11 views
0

私はJSON構造体をデコードしていますが、デコードに失敗した場合は、エラーチェックのこの時点で、サーバーの応答にフィールドの1つが表示されていないことを意味します。ユーザー。codable構造体からエラーメッセージが出る

この構造体をデコード:ここ

struct UserResponseObject: Decodable { 
let message: String 
let data: User 
} 

do { 
      let responseObject = try createDecoder().decode(UserResponseObject.self, from: jsonData) 
      //print("RESPONSE MESSAGE: ", responseObject.message) 
      //print("GET USER DATA: ",responseObject.data) 
      completion!(.success(responseObject.data)) 
     } catch let error as NSError { 
      print("failure to decode user from JSON") 
      completion!(.failure(error)) 
     } 

一切フィールド.dataセクションが存在しない場合、私はcatchブロックでresponseObject.messageにメッセージを返すようにしたいです。しかし、私はこの構造体への応答を再コード化することは許されていません。

struct ErrorObject: Decodable { 
let message: String 
} 

最初のデコードに失敗したときにメッセージを取得しようとするとどうなりますか?おかげ

答えて

0

あなたのstruct implemntsは、あなたがより良い任意のフィールドは、JSONから欠落している場合、あなたはすべてのそれは、オプションの最初に作るべきJSONEncoder & JSONDecoder

struct Language: Codable { 
    var name: String 
    var version: Int 
} 

let swift = Language(name: "Swift", version: 4) 
let encoder = JSONEncoder() 
if let encoded = try? encoder.encode(swift) { 
    // save `encoded` somewhere 
} 

if let encoded = try? encoder.encode(swift) { 
if let json = String(data: encoded, encoding: .utf8) { 
print(json) 
} 

let decoder = JSONDecoder() 
if let decoded = try? decoder.decode(Language.self, from: encoded) { 
    print(decoded.name) 
} 
0

を使用してコード可能な場合。あなたのケースでは、

struct UserResponseObject: Decodable { 
    let message: String? // You should decide, should it be optional or not 
    let data: User? // You should decide, should it be optional or not 
} 

また、あなたがUserResponseObjectオブジェクトの新しいインスタンスを作成しようと、あなたのtry-catchブロックでの結果としてあなたのDOブロック... にはデータのケースを扱うべきではありませんする必要があります。

do { 
      let responseObject = try createDecoder().decode(UserResponseObject.self, from: jsonData) 
      //print("RESPONSE MESSAGE: ", responseObject.message) 
      //print("GET USER DATA: ",responseObject.data) 
      if(responseObject.data) { 
       completion!(.success(responseObject.data)) 
      } 
      else { 
       completion!(.failure(//no data error handler)) 
      } 
     } catch let error as NSError { 
      let responseObject = UserResponseObject(message: error.localizedDescription, data: nil) 
      print("failure to decode user from JSON") 
      completion!(.failure(error)) 
     } 
関連する問題