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

时间:2016-12-20 16:02:40

标签: json swift alamofire

我有下面的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)
    }
}

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

4 个答案:

答案 0 :(得分:3)

执行类似

的操作

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

然后您就可以像这样访问该词典中的元素:

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

答案 1 :(得分: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!
}

答案 2 :(得分:0)

Swift 3中的Alamofire示例

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表View Or Collection View等,你就可以这样使用..

  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. 在taleView,cellForRowAt indexPath中,只需使用

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

答案 3 :(得分:0)

斯威夫特3 Swift 3中的Alamofire示例

导入UIKit 进口Alamofire 导入SwiftyJSON

类ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {

var array = [[String:AnyObject]]()

@IBOutlet weak var tableview: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    Alamofire.request("http://www.designer321.com/johnsagar/plumbingapp/webservice/list_advertise.php?zip=123456").responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil)
        {
            let swiftyJsonVar = JSON(responseData.result.value!)
            print("Main Responce")
            print(swiftyJsonVar)
       }
        if let result = responseData.result.value
        {
           if let Res = (result as AnyObject).value(forKey: "response") as? NSDictionary
            {
                if let Hallo = (Res as AnyObject).value(forKey: "advertise_list") as? NSArray
                {
                    print("-=-=-=-=-=-=-")
                    print(Hallo)

                    self.array = Hallo as! [[String:AnyObject]]
                    print(self.array)


                }

            }
            self.tableview.reloadData()
        }


    }



}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return array.count
}

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

    var dict = array[indexPath.row]
    cell.lbl1.text = dict["address"] as? String
    cell.lbl2.text = dict["ad_created_date"] as? String
    cell.lbl3.text = dict["phone_number"] as? String
    cell.lbl4.text = dict["id"] as? String
    cell.lbl5.text = dict["ad_zip"] as? String

    let imageUrlString = dict["ad_path"]
    let imageUrl:URL = URL(string: imageUrlString as! String)!
    let imageData:NSData = NSData(contentsOf: imageUrl)!
    cell.img.image = UIImage(data: imageData as Data)



    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
    return 100
}

}