如何从服务器解析数据?应用程序从字典读取数据时崩溃

时间:2016-11-21 09:06:42

标签: ios json swift

这是我从服务器获取的JSON数据。

{
  "result": "SUCCESS",
  "resultcode": "000",
  "balance": "-32020",
  "available": "-32020",
  "reserved": 0
}

当我尝试解析这些JSON数据时,App崩溃并抛出Could not cast value of type '__NSCFNumber' (0x1a17dab60) to 'NSString' (0x1a17e5798).

我知道问题与数据类型有关。但是当我在上面的JSON数据中获得reserved键的正值时,它会在JSON数据中显示字符串值,但是当我得到reserved键的负值时,它会返回Numeric数据类型。

以下是我正在阅读数据的代码。

self.response?.objectForKey("reserved")  as! NSString

那么如何处理这类问题?

5 个答案:

答案 0 :(得分:3)

您可以使用if let语句解析数据。请查看以下

if let reservedNum = JSON["reserved"] as? Double {
  print(reservedNum)
} else if let reservedString = JSON["reserved"] as? String {
  print(reservedString)
} else {
  print("Error Parsing Data") 
}    

if let safeResult = JSON["result"] as? String {
   print(safeResult)
} 

其余部分也是如此,并处理模态中的响应。

答案 1 :(得分:1)

这样的事情:

var reserved:Double?
if let reserved_string=response.value(forKey: "reserved") as? NSString{
    reserved=reserved_string.integerValue
}
if let reserved_float=response.value(forKey: "reserved") as? Double{
     reserved=reserved_float
}

答案 2 :(得分:0)

因为在你的json响应中,保留键是NSCFNumber类型所以你不能直接强制将它包装成NSString所以使用这种方式:

if let mReserved = self.response?.objectForKey("reserved")  as? Int {
  print(mReserved)
}

答案 3 :(得分:0)

您必须使用Optional检查哪种数据类型。

if self.response?.objectForKey("reserved")  as? NSString{
 //Do something with NSString
}else if self.response?.objectForKey("reserved")  as? NSNumber{
 //Do something with NSNumber
}else {
print("Error") 
}    

答案 4 :(得分:0)

请尝试以下代码

let reservedStr = String(response.value(forKey: "reserved") as! Double)