如何在Swift 3中用Alamofire 4解析这个json?

问题描述 投票:0回答:4

我有下面的json但无法弄清楚如何在Swift 3中解析它。我的代码如下。 API中的json有一个数组根。我正在使用Xcode 8.2.1与Swift 4和Alamofire 4.0。

["items": <__NSArrayM 0x608000248af0>(
{
    currency = USD;
    image = "https://cdn.myDomain.com/image.jpg";
    "item_title" = "Antique Table";
    "name:" = "";
    price = 675;
},
{
    currency = USD;
    image = "https://cdn.mydomain.com/image2.jpg";
    "name:" = "";
    price = 950;
...

这是我的代码。我试图从结果中获取一个数组r字典,但它总是为零。

Alamofire.request(myURL)
    .responseJSON(completionHandler: {
        response in
        self.parseData(JSONData: response.data!)
    })
}

func parseData(JSONData: Data) {

    do {
        let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options:.mutableContainers) as! [String: Any] 
        print(readableJSON)               
    }
    catch {
     print(error)
    }
}

我已经尝试了这个let item = readableJSON["items"] as? [[String: Any]]建议here但它不会编译错误[String:Any] has no subscriptlet item = readableJSON["items"] as? [String: Any]!编译与警告Expression implicitly coerced from string但产生零。解析这个json对我来说是生死攸关的。

json swift alamofire
4个回答
3
投票

做点什么

let responseJSON = response.result.value as! [String:AnyObject]

那么你将能够像这样访问该字典中的元素:

let infoElementString = responseJSON["infoElement"] as! String

0
投票

这是我最终提出的解析json函数。这个json数据的问题在于它是数组中的字典。我是一个菜鸟,大多数答案和我看到的如何不适合我的json数据。这是我最终提出的功能。

var myItems = [[String:Any]]()

然后在我的视图控制器类中

func loadMyItems() {

    Alamofire.request(myItemsURL)
        .responseJSON(completionHandler: {
            response in                
            self.parseData(JSONData: response.data!)

            self.collectionView.reloadData()                
        })
}

func parseData(JSONData: Data) {        
        do {                
            let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options:.allowFragments) as! [String: Any]

            let items = readableJSON["items"] as! [[String: Any]]

            self.myItems = items

 }               
        catch {
         print(error)
        }
}


func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as? myCell

    let dictionary = myItems[indexPath.row] as [String:Any]
    if let item_title = dictionary["item_title"] as? String {
        cell!.textLabel.text = item_title
        print(item_title)
    }

    return cell!
}

0
投票

Swift中的Alamofire示例3

1.首先使用两个cocoapods到你的项目。使用SwiftyJSON进行json解析

pod 'Alamofire'
pod 'SwiftyJSON'
  1. 我的Json在下面 {“loginNodes”:[{“errorMessage”:“Welcome to Alamofire”,“name”:Enamul Haque,“errorCode”:“0”,“photo”:null}]}
  2. 它可以以不同的方式完成。但我已经完成了以下方式。请注意,如果您不需要任何参数来发送服务器,则删除参数选项。它可以工作post或get方法。你可以用任何方式。我的Alamofire代码如下......这对我来说很好...... Alamofire.request("http://era.com.bd/UserSignInSV", method: .post,parameters:["uname":txtUserId.text!,"pass":txtPassword.text!]).responseJSON{(responseData) -> Void in if((responseData.result.value != nil)){ let jsonData = JSON(responseData.result.value) if let arrJSON = jsonData["loginNodes"].arrayObject { for index in 0...arrJSON.count-1 { let aObject = arrJSON[index] as! [String : AnyObject] let errorCode = aObject["errorCode"] as? String; let errorMessage = aObject["errorMessage"] as? String; if("0"==errorCode ){ //Database Login Success Action }else{ // //Database Login Fail Action } } } } }
  3. 如果你使用Like表查看或集合视图等,你可以像这样使用..
  4. 声明一个数组 var arrRes = [String:AnyObject]
  5. 将值分配给数组 if((responseData.result.value!= nil)){ // let jsonData = JSON(responseData.result.value) if((responseData.result.value != nil)){ let swiftyJsonVar = JSON(responseData.result.value!) if let resData = swiftyJsonVar["loginNodes"].arrayObject { self.arrRes = resData as! [[String:AnyObject]] } if self.arrRes.count > 0 { self.tableView.reloadData() } } }
  6. 在uitableView,cellForRowAt indexPath中,只需使用 qazxsw poi

0
投票

Swift 3中的Swift 3 Alamofire示例

导入UIKit导入Alamofire导入SwiftyJSON

class ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {

  let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for:  indexPath) as! customCell
cell.errorLabelName.text = arrRes[indexPath.row]["errorMessage"] as? String

}

© www.soinside.com 2019 - 2024. All rights reserved.