2017-10-13 14 views
4

こんにちは私は以下の構造体をAPI呼び出しから返された大きな構造体に入れ子にしていますが、この部分をエンコード/デコードすることはできません。私が抱えている問題は、customKeyとcustomValueが両方とも動的であることです。動的型/オブジェクトでCodableを使用する

{ 
    "current" : "a value" 
    "hash" : "some value" 
    "values": { 
     "customkey": "customValue", 
     "customKey": "customValue" 
    } 
} 

私はvar values: [String:String]のようなものを試してみましたしかし、それは[String:String]のそのではない実際には配列ので、作業は明らかではありません。

+0

@vadian私は、これは、それらのいずれかの重複がどのように表示されません質問。私は今質問をもっと明確にするよう修正しました。 – Reshad

+0

私は質問を理解し、再開しました。短い答え:動的キーでは 'Codable'を使うことはできません。 – vadian

+0

これを行う別の方法をお勧めしますか? – Reshad

答えて

6

あなたは別の質問への私の答えにリンクしているので、私はあなたの答えにそれを広げます。あなたが見てどこを知っていれば

真実は、すべてのキーを実行時に知られており、次のとおりです。

struct GenericCodingKeys: CodingKey { 
    var intValue: Int? 
    var stringValue: String 

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

    static func makeKey(name: String) -> GenericCodingKeys { 
     return GenericCodingKeys(stringValue: name)! 
    } 
} 


struct MyModel: Decodable { 
    var current: String 
    var hash: String 
    var values: [String: String] 

    private enum CodingKeys: String, CodingKey { 
     case current 
     case hash 
     case values 
    } 

    init(from decoder: Decoder) throws { 
     let container = try decoder.container(keyedBy: CodingKeys.self) 
     current = try container.decode(String.self, forKey: .current) 
     hash = try container.decode(String.self, forKey: .hash) 

     values = [String: String]() 
     let subContainer = try container.nestedContainer(keyedBy: GenericCodingKeys.self, forKey: .values) 
     for key in subContainer.allKeys { 
      values[key.stringValue] = try subContainer.decode(String.self, forKey: key) 
     } 
    } 
} 

使用法:

let jsonData = """ 
{ 
    "current": "a value", 
    "hash": "a value", 
    "values": { 
     "key1": "customValue", 
     "key2": "customValue" 
    } 
} 
""".data(using: .utf8)! 

let model = try JSONDecoder().decode(MyModel.self, from: jsonData) 
+0

あなたの素早い対応に感謝します。通常のデコード可能な値の隣のJSONに他のキーがある場合、これはどのように適用されますか?通常の列挙型コンテナを追加しますか? – Reshad

+0

あなたの新しい要件と混同しています。 JSONを編集してその例を表示できますか? –

+0

JSONを編集しました。私が意味していたことは、私がエンコードしてデコードしている実際のオブジェクトは、key-> objectだけの値以上の価値があるということでした。 :) – Reshad

関連する問題