2017-09-26 82 views
-1

我有一個json,它有一個字典數組。我通過數組迭代從json像這樣得到的元素...在Swift中迭代數組的問題

let prodId = prodArray.first?["product_id"] as? String 

這給了我product_id第一索引。但我的數組有10個元素。所以我正在使用for循環,如果我想要像數組一樣獲取數組中的所有id,而不是像第一個元素那樣,我該怎麼做?..?

編輯:此外,這是我json響應...

{ 
    "success": 1, 
    "TotalRevenue": 「123.12 K", 
    "Productdata": [ 
     { 
      "product_id": "5", 
      "product_name": 「abc」 
      "product_images": [ 
       { 
        "id": "938", 
        "image": "http://myApp.direct.com/public165_1_image_15", 
        "is_default": "1" 
       }, 
       { 
        "id": "939", 
        "image": "http://myApp.direct.com/public165_1_image_16", 
        "is_default": "0" 
       } 

      ] 
     } 
+0

我已經試過像這樣... let prodId = product [「product_id」] as?字符串,但它會引發錯誤無法用類型爲'String'的索引來下標'[[String:Any]]'的值' –

+0

您能否發佈json解析代碼? –

+0

@ User.bw該消息表明'product'包含一個字典數組,而不是一個字典。 – Paulw11

回答

0

可能,最好的,最簡單的辦法是使用flapMap

let productIds: [String] = prodArray.flapMap({ $0["product_id"] as? String }) 

flatMap允許您通過迭代陣列和嘗試以獲得product_id值(所以,如果沒有值爲$0["product_id"] as? StringflatMap過濾掉)。

UPD。

let jsonDict = // json, that converted into dictionary 

if let projectData = jsonDict["Productdata"] as? [[String: Any]] { 
    let productIds = projectData.flatMap({ $0["product_id"] as? String }) 
    let images = projectData.flatMap({ $0["product_images"] as? [[String: Any]] }).flatMap({ $0 }) 
    let imageIds = images.flatMap({ $0["id"] as? String }) 

    let imageURLs: [URL] = images.flatMap { image in 
     guard let imageURL = image["image"] as? String, let url = URL(string: imageURL) else { return nil } 
     return url 
    } 

    print(productIds) // ["5"] 
    print(imageIds) // ["938", "939"] 
    print(imageURLs) // [http://myApp.direct.com/public165_1_image_15, http://myApp.direct.com/public165_1_image_16] 
} 

此外,您可以try it online

+0

@安撫...我已經做了上面的編輯......根據你的建議,我試圖讓prodId爲let productIds:[String] = prodArray.flatMap({$ 0 [「product_id」] as?String})以及進一步的image數組像這樣... let prodImgArray:[String] = prodArray.flatMap({$ 0 [「product_images」] as?String})。這兩個工作正常。但問題是,當試圖得到這樣的id ...讓id:[String] = prodImgArray.flatMap({$ 0 [「id」] as?String})然後它會拋出錯誤'不能下標類型的值'String'與'String'類型的索引'...任何建議...? –

+0

@ User.bw,更新了我的答案 – pacification

+1

謝謝@pacification ... –

0

請嘗試以下代碼。

if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any] { 

      if let productArray = jsonObj["Productdata"] as? [[String:Any]]{ 
       for product in productArray{ 

        if let prodId = prodArray.first?["product_id"] as? String { 
       } 

      } 
     } 
    }