使用swift 2.1迭代JSON命名的字典数组

时间:2015-12-28 16:32:20

标签: ios json swift2

我正在提取一个JSON数组字典,试图将它们添加到我创建的类中,并将它们用于UITableView。 JSON看起来像这样:

   {  
       "inventory":[  
          {  
             "item":"item 1",
             "description":"item 1 description",
             "quantityOnHand":"42",
             "supplier_id":"1",
             "supplierName":"Supplier 1"
          },
          {  
             "item":"item 2",
             "description":"item 2 description",
             "quantityOnHand":"1001",
             "supplier_id":"1",
             "supplierName":"Supplier 1"
          } ...

依旧......

我在我的viewDidLoad()中抓住了所有这些并尝试将每个字典添加到一个类(称为Inventory)以便稍后使用。这是我在序列化JSON的地方:

override func viewDidLoad() {
    super.viewDidLoad()

    let urlString = "my url to json data";
    let session = NSURLSession.sharedSession();
    let url = NSURL(string: urlString)!;

    session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in
        if let responseData = data {
            do {
                let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments)

                print(json) //this prints out the above formatted json



                 if let dict = json as? Dictionary<String, AnyObject> {
                        print(dict["inventory"]![0]!["description"]);
                        print(dict["inventory"]![0]!["item"]);
                        print(dict["inventory"]![0]!["quantityOnHand"]);
                 }
            } catch {
                print("Could not serialize");
            }
       }
    }.resume()
}

我可以使用类似print(dict["inventory"]![0]!["description"]);的内容打印出每个值,但这似乎效率低下。

我是否需要一个用于计算字典数量的for循环?还是for (key, value)循环?事实上,它是一个名为inventory的数组中的一堆字典真的让我失望。如果它是JSON返回键:单个字典中的值对,我想我可以自己解决它。将json["inventory"]放入变量后,我有点担心要做什么。

1 个答案:

答案 0 :(得分:1)

首先将JSON序列化转换为有意义的内容,
在这种情况下Dictionary<String, AnyObject>

let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String, AnyObject>

然后检索字典数组,JSON字符串显示它只包含String种类型。

let inventoryArray = dict["inventory"] as! [Dictionary<String, String>]

如果inventory是可选的,请使用可选绑定

if let inventoryArray = dict["inventory"] as? [Dictionary<String, String>] { }

现在你可以通过一个简单的循环获取数组中的项目,不需要任何类型的转换。

for anItem in inventoryArray {
   print("description:", anItem["description"])
   print("item: ", anItem["item"])
   print("quantityOnHand: ", anItem["quantityOnHand"])
}