Swift 3 解析 JSON 嵌套问题

Posted

技术标签:

【中文标题】Swift 3 解析 JSON 嵌套问题【英文标题】:Swift 3 Parsing JSON nesting issue 【发布时间】:2017-04-28 06:01:36 【问题描述】:

我正在尝试解析一些 json 数据,但我正在努力理解如何提取和分配嵌套值。我可以管理第一级,但当它更进一步时,我会挣扎。

我有一个 parseProductsData 函数,它接收数据并与第一级嵌套一起正常工作。 我如何解析 [“Options”: “values”],[“variants”] 的嵌套 Json 数组。

这是我的 Json。


  products: [
    
      id: 8931647873,
      title: "A bug Life1123",
      body_html: "
Ban neckline
Printed front
Full sleeves
Straight hem
Printed back
100% khaddar shirt without embroidery
 
",
      vendor: "Sapphire",
      product_type: "Configurable Products",
      created_at: "2017-03-01T23:54:41+05:00",
      handle: "a-bug-life",
      updated_at: "2017-03-17T16:30:46+05:00",
      published_at: "2017-01-07T12:33:00+05:00",
      template_suffix: "",
      published_scope: "global",
      tags: "Khaddar, L, M, Women, XL, Yellow",
      variants: [...],
      options: [
        
          id: 10702667329,
          product_id: 8931647873,
          name: "Size",
          position: 1,
          values: [
            "XXS",
            "S",
            "M",
            "L",
            "XL",
            "XXL"
          ]
        ,
        
          id: 10702667393,
          product_id: 8931647873,
          name: "Color",
          position: 2,
          values: [
            "Yellow"
          ]
        
      ],
      images: [
        
          id: 20808811009,
          product_id: 8931647873,
          position: 1,
          created_at: "2017-03-01T23:54:41+05:00",
          updated_at: "2017-03-01T23:54:41+05:00",
          src: "https://cdn.shopify.com/s/files/1/1814/9759/products/a_bugs_life.jpg?v=1488394481",
          variant_ids: []
        ,
        
          id: 20808811073,
          product_id: 8931647873,
          position: 2,
          created_at: "2017-03-01T23:54:41+05:00",
          updated_at: "2017-03-01T23:54:41+05:00",
          src: "https://cdn.shopify.com/s/files/1/1814/9759/products/a_bugs_life..jpg?v=1488394481",
          variant_ids: []
        ,
        
          id: 20808811137,
          product_id: 8931647873,
          position: 3,
          created_at: "2017-03-01T23:54:41+05:00",
          updated_at: "2017-03-01T23:54:41+05:00",
          src: "https://cdn.shopify.com/s/files/1/1814/9759/products/a_bugs_life.__2.jpg?v=1488394481",
          variant_ids: []
        
      ],
      image: ...
    ,
func parseProductsData() 
    Alamofire.request(BASE_URL+"/admin/products.json").responseJSON  response in
        let result = response.result
        if let dict = result.value as? Dictionary<String, AnyObject> 
            if let list = dict["products"] as? [Dictionary<String, AnyObject>] 
                for i in 0..<list.count 
                    print(list[i])
                
            
        
    

【问题讨论】:

你可以使用swiftyjson 我正在其他功能中使用。加内什库马尔 但面临同样的问题:) 您可以ObjectMapper,而不是手动获取所有值。 Here 你可以找到嵌套数据的例子。 @GaneshKumar 你能解释一下吗? swiftyJson是如何解析的? 【参考方案1】:

您所要做的就是了解 层次结构 和数据类型,以便您可以将类型转换为正确的格式。 在这里,您的结构主要类似于字典数组,在您的关键“产品”上,您将获取一个字典数组并将其存储到一个变量说列表中。您现在可以迭代列表并获取字典。然后稍后从 dict 你可以得到键上的值说“id”、“title”、“vendor”和typecast 转换成 字符串。对于诸如“options”、“images”之类的键,您必须再次将其类型转换为字典数组,并且该过程继续进行.只需了解数据类型并以给定格式进行类型转换。

func parseProductsData() 
        Alamofire.request(BASE_URL+"/admin/products.json").responseJSON  response in
            let result = response.result
            if let dict = result.value as? Dictionary<String, AnyObject> 
                if let list = dict["products"] as? [Dictionary<String, AnyObject>] 
                    for dict in 0..<list 
                        //Now if you want to fetch the value on key "Options", you can see that your list of product holds an array Of Dictionary
                        //so all you have to do is

                        let arrOFOptions = dict["options"] as? [Dictionary<String, AnyObject>]

                        //Same goes for variants

                        let arrOfVariants = dict["variants"] as? [Dictionary<String, AnyObject>]
                    
                
            
        
    

【讨论】:

您应该使用 Swift 3 字典值类型 Any 而不是 AnyObject as? [String: Any] as? [[String: Any]] 用于字典数组 请注意,使用 AnyObject 时,您的值(Double、Int、Float)将转换为 NSNumber @LeoDabus :是的,我完全同意你的看法。我只使用了这种方法,因为问题只是以这种格式提出的。 :) @LeoDabus 你能解释一下它是如何使用 SwiftyJson 实现的吗?

以上是关于Swift 3 解析 JSON 嵌套问题的主要内容,如果未能解决你的问题,请参考以下文章

在 SWIFT 4 中解析嵌套的 JSON

如何使用 Codable 和 Swift 解析这个嵌套的 JSON?

如何解析嵌套的json?迅速

如何解析嵌套的 JSON 字典(地图)

在 Swift 4 中使用对象映射器解析嵌套对象

在 Swift 3 和 Xcode 8 中从嵌套字典中获取值的问题