2017-09-08 9 views
1

私はこのようなJSONを持っています。キーが動的であるSwift 4でJSON用のDecodableを書き込む方法は?

は私が復号可能な構造体を作ることにヘルプが必要ですスウィフト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" 
    } 
} 

を使用して、私のiOSアプリに対応した復号可能な構造体を作成する必要があります。どのようにcherryoddsuper-chocolateのような未知のキーに言及する。

+0

「チェリー」、「奇妙な」、または「スーパー・チョコレート」を構造体にどのくらい正確に表示したいですか? –

+0

基本的にSwift JSON APIを使用する必要がありますか、JSONModelのようなものを使用していますか? – prabodhprakash

+0

@AndréSlotta私はそれらのタイトル(チェリー、奇妙な、超チョコレート)が配列で必要です。 – iranjith4

答えて

5

あなたが必要とするのは、CodingKeysを定義する際に創造的になることです。応答をFoodListとし、内部構造をFoodDetailとしましょう。 FoodDetailのプロパティを定義していないので、キーはすべてオプションです。

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

この方法でエンコード可能なプロトコルを実装する方法を教えてください。 – tyegah123

+0

Nevermind、私はjsonのデコードとエンコードに関するすべてのことを説明するサイトを見つけました。 http://benscheirman.com/2017/06/ultimate-guide-to-json-parsing-with-swift-4/ – tyegah123

関連する問題