简体   繁体   English

在Swift 4中使用codable解析嵌套数组

[英]parsing nested Array using codable in swift 4

I am getting many random issues. 我收到许多随机问题。 Mostly like some structure is not decodable not able to understand how to define structure. 大多像某些结构无法解码,无法理解如何定义结构。

Please find the code snipped 请发现代码被截断

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)
}

First of all and once again, please conform to the naming convention: 首先,请再次遵守命名约定:

  • struct and class names start with a uppercase letter. struct名和class名以大写字母开头。
  • Variable and function names start with a lowercase letter. 变量和函数名称以小写字母开头。
  • All variable and struct / class names are camelCased rather than snake_cased . 所有变量和struct / class名都是驼峰式的,而不是snake_cased的

Second of all, JSON is very easy to read. 其次,JSON非常易于阅读。 There are only two collection types (array [] and dictionary {} ) and four value types. 只有两种集合类型(数组[]和字典{} )和四种值类型。

Format the JSON string to be able to recognize the structure more conveniently 格式化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"}]]
            }
}
"""

Then build the structs according to the JSON structure step by step 然后根据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
}

Then decode the stuff 然后解码东西

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