2016-11-18 7 views
0

JSONからのデータを含む表をロードしようとしています。 JSONを配列に逆シリアル化したいとにかく、それは簡単だが、私は警告(このスレッドのタイトルと同じ)を解決することはできません。無関係の型 'JSON'(別名「<String, Any>」)への「配列<JSON>」からのキャストは常に失敗します

これはJSONデータである: 初期化サーバーから

import Gloss 
... 
class CourierViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
struct courierList: Decodable{ 
    let shipper: String? 
    let service: String? 
    let cost: Int? 
    let etd: String? 

    init?(json: JSON){ 
     self.shipper = "shipper" <~~ json 
     self.service = "service" <~~ json 
     self.cost = "cost" <~~ json 
     self.etd = "etd" <~~ json 
    } 
} 
var TableData:Array<JSON> = Array<JSON>() 
... 
} 

ダウンロードJSON::

http://prntscr.com/d8zdb5

これは私のコードスニペットである(それが有効なJSONだが、私はすでにJSONLintを使用して、それをチェックします)

... 
override func viewDidLoad() { 
    super.viewDidLoad() 
    get_data_from_url(url: "https://www.imperio.co.id/project/ecommerceApp/CourierDataReq.php") 
} 
... 
func get_data_from_url(url:String){ 
    self.TableData.removeAll(keepingCapacity: false) 
    let parameterURL = ["dest":User_city.text!,"weight":String(CartManager.sharedInstance.totalWeightInCart())] 
    Alamofire.request(url, parameters: parameterURL).validate(contentType: ["application/json"]).responseJSON{ response in 
     switch response.result{ 
     case .success(let data): 
      self.TableData.append(data as! JSON) 
      DispatchQueue.main.async(execute: { 
       self.tableView.reloadData() 
      }) 
      break 
     case .failure(let error): 
      print("Error: \(error)") 
      break 
     } 
    } 
} 

アレイを使用してtableViewをロードする

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    guard let value = TableData as? JSON, //the warning appears in here 
     let eventsArrayJSON = value["ShipperResult"] as? [JSON] 
     else { fatalError() } 
    let CourierList = [courierList].from(jsonArray: eventsArrayJSON) 
    print((CourierList?.count)!) 
    return (CourierList?.count)! 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "CourierCell", for: indexPath) as! CourierTableViewCell 

    if indexPath.row % 2 == 0 { 
     cell.backgroundColor = UIColor(red: 200.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0) 
    } else { 
     cell.backgroundColor = UIColor(red: 135.0/255.0, green: 212.0/255.0, blue: 236.0/255.0, alpha: 1.0) 
    } 

    guard let value = TableData as? JSON, //The warning appears in here 
     let eventsArrayJSON = value["ShipperResult"] as? [JSON] 
     else { fatalError() } 
    let CourierList = [courierList].from(jsonArray: eventsArrayJSON) 
    for j in 0 ..< Int((CourierList?.count)!){ 
     cell.label_shippingCourier.text = (CourierList?[j].shipper!)! 
     cell.label_shippingCourier.sizeToFit() 
     cell.label_serviceName.text = (CourierList?[j].service!)! 
     cell.label_serviceName.sizeToFit() 
     cell.label_estCost.text = String(describing: (CourierList?[j].cost!)!) 
     cell.label_estCost.sizeToFit() 
     if (CourierList?[j].etd! == "") { 
      cell.label_etd.text = "Data is not available" 
     } else { 
      cell.label_etd.text = (CourierList?[j].etd!)! 
     } 
     cell.label_etd.sizeToFit() 
    } 
    cell.selectionStyle = .none 

    return cell 
} 

どのように問題を解決するか?ありがとうございました。

編集: 私はスウィフト3.

+0

エラーメッセージに、**配列**を**辞書**にキャストしようとしていますが、これは不可能です。 – vadian

答えて

0

@vadianを使用することを言及するのを忘れては私を助けてどうもありがとうございます、それはトリッキーな間違いです。

何らかの理由でこの問題を解決する人にとっては、答えは: 「万一、辞書を辞書にキャストしないでください」空の辞書を作成する必要がある場合は、この記事を読んでくださいSwift: declare an empty dictionary