2017-05-03 27 views
0

私はAPIからの応答を使用してJSONとして解析しています。Swift 3 JSON解析例外

 var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! [String: AnyObject] 
     let status = readableJSON["status"] as! String 

     if status == "success" { 
      if let profileInfo = readableJSON["profile_info"] { 

       let stb = UIStoryboard(name: "Main", bundle: nil) 
       let vcVerifyOTP = stb.instantiateViewController(withIdentifier: "verify_otp") as! VCVerifyOTP 
       vcVerifyOTP.sessionID = readableJSON["otp_session_id"] as! String 
       vcVerifyOTP.userID = readableJSON["customer_id"] as! String 
       vcVerifyOTP.first_name = profileInfo["firstname"] as! String 
       vcVerifyOTP.last_name = profileInfo["lastname"] as! String 
       vcVerifyOTP.email_id = profileInfo["email"] as! String 
       vcVerifyOTP.phone_number = profileInfo["mobile"] as! String 

       let scores = profileInfo["scores"] as! [String: AnyObject] 

       vcVerifyOTP.gmat = scores["gmat"] as! String 
       vcVerifyOTP.gre = scores["gre"] as! String 
       vcVerifyOTP.ielts = scores["ielts"] as! String 
       vcVerifyOTP.tofel = scores["tofel"] as! String 

       self.present(vcVerifyOTP, animated: true, completion: nil) 
      } 
     } else { 
      let alert = UIAlertController(title: "Error", message: "Login Unsuccessful.", preferredStyle: UIAlertControllerStyle.alert) 
      alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
      self.present(alert, animated: true, completion: nil) 
     } 

上記のコードは、「スコア」JSONObjectにデータが含まれていれば問題ありませんが、ブランクのアプリケーションがクラッシュした場合はうまく動作します。 "成功"、 "otp_session_id": "someValueの"、 "CUSTOMER_ID": "someValueの"、 "profile_info": { 'スコア' はデータが含まれている場合

{ "ステータス"(応答です) "FIRSTNAME": "someValueの"、 "姓": "someValueの"、 "電子メール": "someValueの"、 "モバイル": "someValueの"、 "スコア": { "GMAT": "someValueの"、 " gre ":" somevalue "、 " ielts ":" somevalue "、 " tofel ":" somevalue " } } }

'スコア' はDATA(応答である)(ERRORを与える) { "ステータス" が含まれていない場合: "成功"、 "otp_session_id": "someValueの"、 "CUSTOMER_IDを": "someValueの"、 "profile_info": { "FIRSTNAME": "someValueの"、 "姓": "someValueの"、 "電子メール": "someValueの"、 "モバイル": "someValueの"、 「スコア":[0] } }

どういうことが起こっているのですか?「スコア」内にデータがある場合はJSONObjectとして表示され、「スコア」内にデータがない場合はJSONArrayとして返されます。

配列がクラッシュすると、私は多くのことを試みましたが、私はこの例外をキャッチできません。私は値がJSONObjectかJSONArrayかどうかをチェックしようとしましたが、まだ成功しませんでした。助けてください。

+0

の代わりに、すべて自分で処理してください。 ObjectMapperやSwiftyJsonのようなライブラリを使わないのはなぜですか? –

+0

最初にスコアがデータ(キー、値)を含んでいるかどうかを確認する必要があるかどうかを確認します。 –

+0

はい、それは簡単ですが、問題があるので、私の新しいライブラリを避けようとしています。 – xSHERU

答えて

2

スコアオブジェクトはフォーマットを変更できるので、暗黙のアンラップ(!)を使用する必要があります。これは、オブジェクトが必ず同じ形式であることをコンパイラに指示するためです。代わりにletと一緒にオプションの型キャスティングを使用してください。この場合、アプリはクラッシュしません。

あなたはこれを試してみてください。

if let scores = profileInfo["scores"] as? [String: AnyObject]{ vcVerifyOTP.gmat = scores["gmat"] as! String 
       vcVerifyOTP.gre = scores["gre"] as! String 
       vcVerifyOTP.ielts = scores["ielts"] as! String 
       vcVerifyOTP.tofel = scores["tofel"] as! String 

} 

else { scores = profileInfo["scores"] as? [Int] } 

ホープこれはあなたを助け!

+0

Thanks Pallavi、遅延のために申し訳ありません...これは問題を解決しました。 – xSHERU

+0

WC、ハッピー・トゥ・ヘルプ: –