2016-09-21 130 views
1

我遇到了麻煩更新我的應用程序作爲Alamofire和SwiftyJSON尚未支持斯威夫特3.我有一個網址,將返回我JSON如下:斯威夫特3 JSON解析

{ 
    "products": [ 
     { 
      "body_html":"", 
      "created_at":"2016-03-02T13:56:18+03:00", 
      "id":489759251, 
      "handle":"product", 
      "options":[ 
       { 
        "id":627488838, 
        "product_id":489759251, 
        "name":"Title", 
        "position":1, 
        "values":[ 
         "Default Title" 
        ] 
       } 
      ], 

     }, 

     { 
      "body_html":"", 
      "created_at":"2016-03-08T05:17:55+03:00", 
      "id":530420915, 
      "handle":"product-2", 
      "options":[ 
       { 
        "id":6319359750, 
        "product_id":530420915, 
        "name":"Title", 
        "position":1, 
        "values":[ 
         "Default Title" 
        ] 
       } 
      ], 

     }, 
    ] 
} 

我需要能夠解析該json並列出所有返回的產品,並能夠讀取每個特定的屬性和子選項。

我在這裏查了一些其他的問題,發現了幾個解決方案,並能夠得到json數據並按照上面的方式打印出來。但是,我無法解析它。

let shopUrl = "https://\(apiKey):\(password)@\(hostname)" + "/admin/products.json" 

let url = URL(string: shopUrl) 
URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in 
    if error != nil { 
     print(error) 
    } else { 
     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any] 
      print(json) 
     } catch let error as NSError { 
      print(error) 
     } 
    } 
}).resume() 

任何幫助?

+0

這不是JSON,這是表示反序列化結果的「print」行的輸出。 – vadian

+0

是的,沒錯。我認爲提供打印輸出會讓我更容易提供幫助 – Hamid

+0

我知道它並不能幫助回答你的問題,但Alamofire4.0確實有Swift 3的支持。 SwiftyJSON沒有任何Swift 3的支持,除了一個早期beta版本的分支之外。 – donnywals

回答

0

要遍歷所有需要提取的產品並將其轉換爲正確的類型。在這種情況下,數組爲[String: Any]

我提取了相關的代碼位並清理了一下,使這個答案更具可讀性。

guard let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any], 
    let products = json["products"] as? [[String: Any]] 
    else { return } 

for product in products { 
    guard let id = product["id"] as? Int, 
     let options = product["options"] as? [[String: Any]] 
     else { return } 

    print(id) 
    print(options) 
} 
+0

是否有可能得到產品的計數? – Hamid

+0

products.count正在工作!很好 – Hamid

+0

非常感謝你donnywals – Hamid

0

解析JSON,根對象是一個字典,用於productsoptions的對象是數組。作爲示例,分別打印一個值。

if let jsonObject = try JSONSerialization.jsonObject(with:data, options: []) as? [String:Any] { 
    print(jsonObject) 
    if let products = jsonObject["products"] as? [[String:Any]] { 
    for aProduct in products { 
     print(aProduct["created_at"]) 
     if let options = aProduct["options"] as? [[String:Any]] { 
     for option in options { 
      print(option["product_id"]) 
     } 
     } 
    } 
    } 
} 
+0

我建議使用'guard'而不是所有這些'如果let'結構。嵌套將很快導致厄運的臭名昭着的金字塔.. – donnywals

+0

非常感謝幫助。我吃掉它了。 – Hamid