迅速

2016-12-04 22 views
0

で光沢とAlamofireと構文解析JSONデータ私はスウィフト3、グロス1.1およびAlamofire 4.0とWebRequestクラスからJSONオブジェクトをデコードしようとしている: JSONレスポンスは次のようになります。迅速

{ 
    "code": "0", 
    "message": "OK.", 
    "data": [ 
     { 
      "timestamp": 1480885860, 
      "open": 10.99 
     }, 
     { 
      "timestamp": 1480886040, 
      "open": 11 
     } 
    ] 
} 

私のJSON Decodables

struct ResponseJsonModel : Decodable { 
    let code : Int 
    let message : String 
    let data : [MarketPriceJsonModel]? 

    // <~~ 
    init?(json: JSON) { 
     guard let codeInt : Int = "code" <~~ json else { 
      print("code unwrapping failed in guard") 
      return nil 
     } 
     guard let messageStr : String = "message" <~~ json else { 
      print("message unwrapping failed in guard") 
      return nil 
     } 

     self.code = codeInt 
     self.message = messageStr 
     self.data = "data" <~~ json 
    } 
} 
struct MarketPriceJsonModel : Decodable { 
    let timestamp : NSDate 
    let open : Double 
    init?(json: JSON) { 
     guard let timestampInt : Int = "timestamp" <~~ json else { 
      print("timestamp unwrapping failed in guard") 
      return nil 
     } 
     guard let open : Double = "open" <~~ json else { 
      print("open price unwrapping failed in guard") 
      return nil 
     } 
     self.timestamp = NSDate(timeIntervalSince1970: Double(timestampInt)) 
     self.open = open 
    } 
} 

私はGlossが新しく、なぜ自分の解読可能オブジェクトの初期化が失敗するのか理解できません。

Alamofire.request(url).validate().responseJSON { response in 
      switch response.result { 
      case .success: 
       guard let value = response.result.value as? JSON, 
        let responseModel = ResponseJsonModel(json: value) else { 
        print("responseModel failed") 
        return 
       } 
       print(responseModel.message) 
      case .failure(let error): 
       print(error) 
      } 
     } 

コードの出力はresponseModelガードに

を失敗したアンラッピング

コードが

を失敗したが、なぜか?

私はinit?()にブレークポイントを追加し、デバッグ領域でjson-variableを調べると、要求はうまくいっても解析は失敗します。

debug area with json variable

何かが失敗した場合には、より良い例外メッセージを取得する方法はありますか?

すべての入力が高く評価されています。

答えて

1

問題を解決しました。 Webサービスの構成に誤りがありました。 あなたが見ることができるように、コード属性のJSONレスポンスがあった。

"code": "0", 

このフォーマットは明らかに文字列を意味し、そのためのIntに解析すると、私のガードは失敗します。 これを解決するには、2つの方法があります。

オプション1:のいずれかに変更JSON応答:

"code": 0, 

(値はもはや引用符を包囲しています)。これはおそらく、Webサービスの間違ったデータ型を修正するための最良の解決策ですが、サービスのコードベースを完全に制御する必要があります。

オプション2:は、単にjsonレスポンスをStringに解析し、その後、Intワークに強制的に展開します。このソリューションの場合、Webサービスは変更されません。

guard let codeStr : String = "code" <~~ json else { 
    print("code unwrapping failed in guard") 
    return nil 
} 
self.code = Int(codeStr)!