簡體   English   中英

在Swift 4中使用codable解析嵌套數組

[英]parsing nested Array using codable in swift 4

我收到許多隨機問題。 大多像某些結構無法解碼,無法理解如何定義結構。

請發現代碼被截斷

var JSON = """
{"variants":{"variant_groups":[{"group_id":"1","name":"Crust","variations":[{"name":"Thin","price":0,"default":1,"id":"1","inStock":1},{"name":"Thick","price":0,"default":0,"id":"2","inStock":1,"isVeg":1},{"name":"Cheese burst","price":100,"default":0,"id":"3","inStock":1,"isVeg":1}]},{"group_id":"2","name":"Size","variations":[{"name":"Small","price":0,"default":1,"id":"10","inStock":1,"isVeg":0},{"name":"Medium","price":100,"default":0,"id":"11","inStock":1,"isVeg":1},{"name":":Large","price":200,"default":0,"id":"12","inStock":1,"isVeg":0}]},{"group_id":"3","name":"Sauce","variations":[{"name":"Manchurian","price":20,"default":0,"id":"20","inStock":1,"isVeg":0},{"name":"Tomato","price":20,"default":0,"id":"21","inStock":1,"isVeg":1},{"name":"Mustard","price":20,"default":0,"id":"22","inStock":1,"isVeg":0}]}],"exclude_list":[[{"group_id":"1","variation_id":"3"},{"group_id":"2","variation_id":"10"}],[{"group_id":"2","variation_id":"10"},{"group_id":"3","variation_id":"22"}]]}}
""".data(using: .utf8)

/* 
 not sure is this the right way to define Root
*/
    struct Root : Codable {

        let variants : varientStruct
        let exclude_list : exclude_list

    }

    struct exclude_list : Codable{
        let variation_id : String
        let group_id : String
    }

    struct varientStruct: Codable {
        let variant_groups = [variant_groups_struct]
    }
    struct variant_groups_struct : Codable {
        let group_id : String
        let name :String
        let variations: [variationsStruct]
    }

    struct variationsStruct :Codable {
        let name : String
        let price : Int
        let selected: Int
        let id : String
        let inStock: Bool

        enum CodingKeys : String, CodingKey {
            case name
            case price
            case selected = "default"
            case id
            case inStock
        }
    }
}

do {
    let data = Data(person.utf8)
    let result = try JSONDecoder().decode(Root.self, from: JSON)
    print(result)
} catch  {
    print(error)
}

首先,請再次遵守命名約定:

  • struct名和class名以大寫字母開頭。
  • 變量和函數名稱以小寫字母開頭。
  • 所有變量和struct / class名都是駝峰式的,而不是snake_cased的

其次,JSON非常易於閱讀。 只有兩種集合類型(數組[]和字典{} )和四種值類型。

格式化JSON字符串以便能夠更方便地識別結構

let jsonString = """
{"variants":{"variant_groups":[{"group_id":"1","name":"Crust","variations":
                                    [{"name":"Thin","price":0,"default":1,"id":"1","inStock":1},
                                    {"name":"Thick","price":0,"default":0,"id":"2","inStock":1,"isVeg":1},
                                    {"name":"Cheese burst","price":100,"default":0,"id":"3","inStock":1,"isVeg":1}]
                                },{"group_id":"2","name":"Size","variations":
                                    [{"name":"Small","price":0,"default":1,"id":"10","inStock":1,"isVeg":0},
                                    {"name":"Medium","price":100,"default":0,"id":"11","inStock":1,"isVeg":1},
                                    {"name":":Large","price":200,"default":0,"id":"12","inStock":1,"isVeg":0}]
                                },{"group_id":"3","name":"Sauce","variations":
                                    [{"name":"Manchurian","price":20,"default":0,"id":"20","inStock":1,"isVeg":0},
                                    {"name":"Tomato","price":20,"default":0,"id":"21","inStock":1,"isVeg":1},
                                    {"name":"Mustard","price":20,"default":0,"id":"22","inStock":1,"isVeg":0}]
                                }],
            "exclude_list":[[{"group_id":"1","variation_id":"3"}, {"group_id":"2","variation_id":"10"}],
                            [{"group_id":"2","variation_id":"10"},{"group_id":"3","variation_id":"22"}]]
            }
}
"""

然后根據JSON結構逐步構建結構

struct Root : Decodable {
    let variants : Variant
}

struct Variant : Decodable {

    private enum CodingKeys : String, CodingKey {
        case groups = "variant_groups"
        case excludeList = "exclude_list"
    }

    let groups : [VariantGroup]
    let excludeList : [[ExcludeList]]
}

struct VariantGroup : Decodable {

    private enum CodingKeys : String, CodingKey {
        case groupID = "group_id"
        case name, variations
    }

    let groupID : String
    let name : String
    let variations : [Variation]
}

struct Variation  : Decodable {

    let name : String
    let price : Int
    let `default` : Int
    let id : String
    let inStock : Int
}


struct ExcludeList : Decodable {
    private enum CodingKeys : String, CodingKey {
        case groupID = "group_id"
        case variationID = "variation_id"
    }

    let groupID : String
    let variationID : String
}

然后解碼東西

do { 
   let data = Data(jsonString.utf8)      
   let result = try JSONDecoder().decode(Root.self, from: data)
   print(result)

} catch { print(error) }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM