2017-12-25 14 views
-2

Ich bekomme viele zufällige Probleme. Meistens ist eine Struktur nicht decodierbar und nicht in der Lage zu verstehen, wie man eine Struktur definiert.Parsing verschachtelte Array mit codable in Swift 4

finden Sie den 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) 
} 
+0

Ihre Frage ist in der Kategorie "hier ist ein Blob von Code. Warum hat es Fehler". Was willst du von der JSON? –

+0

Ich bin nicht in der Lage zu verstehen, wie variant_groups und exclude_list zu analysieren – user2068378

Antwort

3

Zunächst einmal und noch einmal, entsprechen Sie in der Namenskonvention:

  • struct und class Namen beginnen mit einem Groß Brief.
  • Variablen- und Funktionsnamen beginnen mit einem Kleinbuchstaben Buchstaben.
  • Alle Variable und struct/class Namen sind camelcased statt snake_cased.

Zweitens ist JSON sehr einfach zu lesen. Es gibt nur zwei Auflistungstypen (Array [] und Verzeichnis {}) und vier Werttypen.

Format der JSON-String der Lage sein, die Struktur bequemer die Strukturen bauen

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"}]] 
      } 
} 
""" 

dann zu erkennen, entsprechend dem JSON Struktur Schritt für Schritt

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 
} 

das Zeug dann dekodieren

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

} catch { print(error) } 
+0

Vielen Dank für Ihre Hilfe. Ich bin wirklich verwirrt und nicht sicher, wann Codabele/Encodable/Decodable zu verwenden? Ich habe keine klare Definition gefunden. Bitte hilf mir mit Regeln. – user2068378

+0

Hallo, Wie kann ich GroupView Schlüssel und Wert in Variation Struktur hinzufügen? – user2068378

+0

[typealias Codable = Decodierbar und codierbar] (https://developer.apple.com/documentation/swift/codable) – vadian