2017-02-23 82 views
2

我正在处理一个项目,并且已到达要从表视图中的Web服务显示数据的阶段。我现在用的是Alamofire库,但是当我建立我的项目,我得到的错误:无法将'__NSDictionaryI'(0x16e9900)类型的值转换为'NSArray'(0x16e96f8)

Could not cast value of type '__NSDictionaryI' (0x16e9900) to 'NSArray' (0x16e96f8).

我的代码如下:

import UIKit 
import Alamofire 

class TestingViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    var listData : [[String : AnyObject]] = [[String : AnyObject]]() 
    @IBOutlet weak var tableView: UITableView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.dataSource = self 
     self.tableView.delegate = self 

     let url : URL = URL(string : "some url")! 
     Alamofire.request(url).responseJSON(completionHandler: { 
      response in 
      switch response.result{ 
      case .success: 
       self.listData = response.result.value as! [[String : AnyObject]] 
       self.tableView.reloadData() 
      case .failure(let error): 
       print(error) 
      } 

     }) 
     // Do any additional setup after loading the view. 
    } 
} 

JSON数据如下:

{ 
    "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 
    } 
    ] 
} 

我想显示OCS余额的walletName,walletBalance和walletBalanceExpiryDate,以及我想显示svrName,quotaBalance,quotaConsumption,expiryDate的pcrfBalances

+1

究竟哪一行导致错误? – rmaddy

+0

上的代码如下: self.listData = response.result.value as! [[String:AnyObject]] –

+0

'response.result.value'是一个Dictionary,而不是您输入它的字典数组。 – Larme

回答

1

错误是来自:

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

由于错误抱怨你正尝试将字典转换为数组,这显然意味着response.result.value是一本字典。所以你试图将它作为一个数组投入失败。

也许字典包含所需的数组。你需要深入字典并获取你想要的任何数据。或者改变你的演员阵容,作为一个合适的词典

更具体的答案将要求您编辑您的问题,更详细地了解您所获取的数据以及您需要的数据。

2

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

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

原来快译通对象是这样的位置:

[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]] 
} 

应该返回你想要的清单数据

+0

在这个答案的最后建议,可允许代码编译和运行但并不意味着它是正确的。字典值可能包含所需的数组。 OP没有提供足够的信息来了解。 – rmaddy

+0

@rmaddy我添加了json数据和我真正想要显示的内容 –

0

基于你在那里粘贴的JSON数据,好像你正在试图访问oscBalances列表,以便您的代码看起来应该像这样:

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

或者,如果你真的想强行投中的数据(这将崩溃,如果意想不到的事情在JSON显示出来),它会看样T他的:

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

第一种方法更安全。

相关问题