2017-09-08 2 views
1

Ich habe ein JSON wie folgt.Wie schreibe ich ein Decodable für ein JSON in Swift 4, wo Schlüssel dynamisch sind?

Ich brauche 4.

{ 
    "cherry": { 
     "filling": "cherries and love", 
     "goodWithIceCream": true, 
     "madeBy": "my grandmother" 
    }, 
    "odd": { 
     "filling": "rocks, I think?", 
     "goodWithIceCream": false, 
     "madeBy": "a child, maybe?" 
    }, 
    "super-chocolate": { 
     "flavor": "german chocolate with chocolate shavings", 
     "forABirthday": false, 
     "madeBy": "the charming bakery up the street" 
    } 
} 

eine entsprechende Dekodierbare Struktur in meinem iOS-App mit Swift machen darauf, die Dekodierbare Struct Hilfe brauchen. Wie erwähnt man die unbekannten Schlüssel wie cherry, odd und super-chocolate.

+0

Wie genau würden Sie wollen, dass 'cherry',' odd' oder 'super-chocolate' in der Struktur dargestellt werden? –

+0

Müssen Sie Swift JSON APIs verwenden oder sind Sie offen für die Verwendung von JSONModel? – prabodhprakash

+0

@ AndréSlotta Ich brauche diese Titel (Kirsche, ungerade, Super-Schokolade) in einem Array. – iranjith4

Antwort

5

Was Sie brauchen, ist kreativ bei der Definition der CodingKeys. Nennen wir die Antwort a FoodList und die innere Struktur FoodDetail. Sie haben die Eigenschaften von FoodDetail nicht definiert, also nehme ich an, dass die Schlüssel alle optional sind.

struct FoodDetail: Decodable { 
    var filing: String? 
    var goodwWithIceCream: Bool? 
    var madeBy: String? 
    var flavor: String? 
    var forABirthday: Bool? 
} 

struct FoodList: Decodable { 
    var foodNames: [String] 
    var foodDetails: [FoodDetail] 

    // This is a dummy struct as we only use it to satisfy the container(keyedBy:) function 
    private struct CodingKeys: CodingKey { 
     var intValue: Int? 
     var stringValue: String 

     init?(intValue: Int) { self.intValue = intValue; self.stringValue = "" } 
     init?(stringValue: String) { self.stringValue = stringValue } 
    } 

    init(from decoder: Decoder) throws { 
     self.foodNames = [String]() 
     self.foodDetails = [FoodDetail]() 

     let container = try decoder.container(keyedBy: CodingKeys.self) 
     for key in container.allKeys { 
      self.foodNames.append(key.stringValue) 
      try self.foodDetails.append(container.decode(FoodDetail.self, forKey: key)) 
     } 
    } 
} 

// Usage 
let list = try! JSONDecoder().decode(FoodList.self, from: jsonData) 
+0

Können Sie mir sagen, wie das codierbare Protokoll mit diesem Ansatz zu implementieren? – tyegah123

+0

Nevermind, ich fand eine Website, die alles über JSON-Decodierung und -Encodierung erklärt. http://benscheiman.com/2017/06/ultimate-guide-to-json-parsing-with-swift-4/ – tyegah123

Verwandte Themen