外部ソースから受信したJSONを解析するためにDecodable
プロトコルを使用しています。私が知っている属性をデコードした後も、まだ知られておらず、まだデコードされていないいくつかの属性がJSONに存在する可能性があります。たとえば、外部ソースが将来の時点でJSONに新しい属性を追加した場合、これらの未知の属性を[String: Any]
ディクショナリ(または代替)に保存して値を無視しないようにしたいと考えています。Swift 4のDecoderコンテナから非コード化属性を取得する方法は?
問題は、私が知っている属性をデコードした後に、デコードされていない属性を取得するためのコンテナにアクセサがないことです。私はdecoder.unkeyedContainer()
を知っていますが、各値を繰り返し処理することはできますが、これは私の場合は機能しません。なぜなら、どの値型を繰り返し処理しているのですか?JSON必ずしも同一ではない。ここで
は私が達成しようとしている何のための遊び場での例です:
// Playground
import Foundation
let jsonData = """
{
"name": "Foo",
"age": 21
}
""".data(using: .utf8)!
struct Person: Decodable {
enum CodingKeys: CodingKey {
case name
}
let name: String
let unknownAttributes: [String: Any]
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decode(String.self, forKey: .name)
// I would like to store the `age` attribute in this dictionary
// but it would not be known at the time this code was written.
self.unknownAttributes = [:]
}
}
let decoder = JSONDecoder()
let person = try! decoder.decode(Person.self, from: jsonData)
// The `person.unknownAttributes` dictionary should
// contain the "age" attribute with a value of 21.
unknownAttributes
辞書はage
属性と値この場合は、他の可能な値を格納するために、私は希望 将来外部ソースからJSONに追加される場合は、型を指定します。
このようなことをしたい理由は、JSONに存在する未知の属性を保持できるため、属性キーがわかってから適切にコードを更新できるようにすることです。
私はStackOverflowとGoogleでたくさんの検索を行ってきましたが、まだこのユニークなケースに遭遇していません。前もって感謝します!