使用 swift 2.1 遍历一个 JSON 命名的字典数组

Posted

技术标签:

【中文标题】使用 swift 2.1 遍历一个 JSON 命名的字典数组【英文标题】:Iterate through a JSON named array of dictionaries with swift 2.1 【发布时间】:2015-12-28 16:32:19 【问题描述】:

我正在提取一个 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】:

首先将 JSON 序列化转换为有意义的东西, 在这种情况下Dictionary&lt;String, AnyObject&gt;

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"])

【讨论】:

这非常有用,但我的字典必须是字符串,我的 JSON 必须是字符串吗?我假设它是从数据库传递值,它是一个 Int。我有与需要正确数据类型的 json 匹配的对象,无论是 Int 还是 String。 如果有其他值类型,如Int,您必须将数组转换为[Dictionary&lt;String, AnyObject&gt;],并将下标项转换为特定类型,例如anItem["description"] as! String。但是,您的示例 JSON 字符串确实只包含 String 值。 你说得对,它们是字符串。起初我没有注意到这一点。奇怪的。我将不得不检查我的 API,或者将它们快速转换。谢谢!!

以上是关于使用 swift 2.1 遍历一个 JSON 命名的字典数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中解码一个命名的 json 对象数组

在 Swift 中循环遍历 Alamofire JSON 结果

在 Swift 中遍历嵌入的 JSON 数组?

SWIFT:遍历转换为字典的 JSON 对象

在 Swift 5.1 中循环遍历多维/嵌套 JSON 数据

使用 SwiftyJSON 和 Alamofire 循环遍历 JSON