无法将'__NSDictionaryI'(0x16e9900)类型的值转换为'NSArray'(0x16e96f8)

时间:2017-02-23 17:17:04

标签: ios swift

我正在开发一个项目,并且已经达到了我希望在表格视图中显示来自Web服务的数据的阶段。我正在使用Alamofire库但是当我构建我的项目时,我收到错误:

  

无法将'__NSDictionaryI'(0x16e9900)类型的值转换为'NSArray'(0x16e96f8)。

我的代码如下:

    {
  "oscBalances": [
    {
      "walletName": "Main Balance",
      "walletBalance": -0.548927,
      "walletBalanceExpiryDate": 4607186400000
    },

    {
      "walletName": "Gprs_bundle",
      "walletBalance": 0,
      "walletBalanceExpiryDate": 1472853599000
    },
    {
      "walletName": "Go_SVB1",
      "walletBalance": 0,
      "walletBalanceExpiryDate": 1480738710000
    },

    {
      "walletName": "Go_SVB1",
      "walletBalance": 0,
      "walletBalanceExpiryDate": 1480738710000
    },

    {
      "walletName": "night_bundle",
      "walletBalance": 245.66,
      "walletBalanceExpiryDate": 1486147937000
    },    {
      "walletName": "night_bundle",
      "walletBalance": 245.66,
      "walletBalanceExpiryDate": 1486147937000
    },
    {
      "walletName": "Daily_Data1",
      "walletBalance": 510437397772.4562,
      "walletBalanceExpiryDate": 1487250499000
    },
    {
      "walletName": "Go_SVB1",
      "walletBalance": 0,
      "walletBalanceExpiryDate": 1480738710000
    }
 ],
  "pcrfBalances": [
    {
      "svrName": "Weekly Whatsapp",
      "quotaBalance": 174.92578125,
      "quotaConsumption": 5.07421875,
      "expiryDate": 1488204496000
    }
  ]
}

json数据如下:

{{1}}

我想为OCS余额显示walletName,walletBalance和walletBalanceExpiryDate,对于要显示svrName,quotaBalance,quotaConsumption,expiryDate

的pcrfBalances

3 个答案:

答案 0 :(得分:3)

出现该错误“无法将类型'__NSDictionaryI'(0x16e9900)的值转换为'NSArray'(0x16e96f8)。”换行:

 self.listData = response.result.value as! [[String : AnyObject]]

原始Dict对象就在这里:

[String : AnyObject]

与字典数组(即抛出错误)

[[String : AnyObject]]

所以这条线应该如此成功:

 self.listData = response.result.value as! [String : AnyObject]

<强>更新  @rmaddy提出了一个很好的观点。同样来自您共享的JSON,看起来您尝试访问的数组就在字典中。

所以:

if let dictionary = response.result.value as? [String : AnyObject]{
 self.listData = dictionary["oscBalances"] as! [[String : AnyObject]]
}

应该返回您想要的列表数据

答案 1 :(得分:1)

错误来自:

self.listData = response.result.value as! [[String : AnyObject]]

由于错误是抱怨您正在尝试将字典转换为数组,这显然意味着response.result.value是一个字典。因此,您将其作为数组投射的尝试失败了。

也许字典包含所需的数组。你需要挖掘字典并获得你想要的任何数据。或者将你的演员表改为合适的字典。

更具体的答案将要求您编辑您的问题,其中包含有关您获得的数据以及您需要的数据的更多具体细节。

答案 2 :(得分:0)

根据您粘贴的JSON数据,您似乎正在尝试访问oscBalances列表,因此您的代码应如下所示:

if let dict = response.result.value as? [String : AnyObject], let list = dict["oscBalances"] as? [[String : AnyObject]] {
    self.listData = list
}

或者,如果您真的想强制转换数据(如果JSON中出现意外情况会崩溃),它看起来像这样:

self.listData = (response.result.value as! [String : AnyObject])["oscBalances"] as! [[String : AnyObject]]

第一种方式更安全。