无法解析数据JSON alamofire SwiftJSON

时间:2017-02-04 14:11:41

标签: ios json swift alamofire xcode8

尝试使用alamofire解析一个示例JSON对象,而来自http的SwiftlyJSON无法将其解析为我的产品模型。这真的很奇怪,我在for循环中运行调试器,迭代并执行“po self.productlist”,该值确实附加到数组中。但是当我尝试在循环外打印它时,它就不起作用,当我尝试在调试器模式下执行“po self.productlist [0] [”product“]”时也是如此。有一点它工作真的很奇怪。正如你所看到的,我在imgur链接中附上了2张图片。

我还附上了我的控制器和模型,我不确定我做了什么错误,或者可能有错误。任何帮助,将不胜感激。感谢

控制器

import UIKit
import Alamofire
import SwiftyJSON

class AddProductController: UITableViewController {
    var productlist = [Product]()


    override func viewDidLoad() {
        super.viewDidLoad()

        Alamofire.request("https://api.myjson.com/bins/1f1zop").responseJSON { response in
            let jsondata = JSON(data: response.data!)
            for index in 0..<jsondata["data"].count{

                self.productlist.append(Product(id: jsondata["data"][index]["id"].stringValue, product: jsondata["data"][index]["product"].stringValue, category: jsondata["data"][index]["category"].stringValue, price: jsondata["data"][index]["price"].doubleValue))
            }
        }
        print(self.productlist[0]["id"])

模型

import Foundation

class Product {
    var id:String
    var product:String
    var category: String
    var price: Double


    init(id:String, product:String, category:String, price:Double) {
        self.id = id
        self.product = product
        self.category = category
        self.price = price
    }    
}

Controller shown with Product List[1]

Debugger shown variable productlist was indeed append with value] 2

更新为vadian 谢谢,我明白了!

1 个答案:

答案 0 :(得分:0)

没有错误,那是着名的 async-trap

Alamofire请求异步工作,JSON在<{strong> print行之后返回

只需将print行 - 以及处理数组的代码 - 放入完成块。

发生错误,因为您尝试像字典一样获取id。使用属性.id

顺便说一下:请不要在Swift中使用基于索引的循环

    Alamofire.request("https://api.myjson.com/bins/1f1zop").responseJSON { response in
        let jsondata = JSON(data: response.data!)
        for product in jsondata["data"].array! {
            self.productlist.append(Product(id: product["id"].stringValue, product: product["product"].stringValue, category: product["category"].stringValue, price: product["price"].doubleValue))
        }
        print(self.productlist[0].id) // use the property, it's not a dictionary.
    }

注意:如果从第三方服务加载JSON,您应该使用可选绑定来安全地解析数据。