Ich verwende das Decodable
Protokoll, um JSON zu analysieren, das von einer externen Quelle empfangen wird. Nach dem Decodieren der Attribute, von denen ich weiß, dass sie da sind, können noch einige Attribute in dem JSON existieren, die unbekannt sind und noch nicht dekodiert wurden. Wenn beispielsweise die externe Quelle zu einem späteren Zeitpunkt ein neues Attribut zu dem JSON hinzugefügt hat, möchte ich diese unbekannten Attribute beibehalten, indem ich sie in einem [String: Any]
Wörterbuch (oder einer Alternative) ablege, damit die Werte nicht ignoriert werden.Wie erhalten Sie die nichtdecodierten Attribute von einem Decoder-Container in Swift 4?
Das Problem ist, dass nach dem Decodieren der Attribute, die ich weiß, gibt es keine Zugriffsmethoden auf den Container, um die Attribute, die noch nicht dekodiert wurden abrufen. Ich kenne die decoder.unkeyedContainer()
, die ich verwenden könnte, um über jeden Wert zu iterieren, aber dies würde in meinem Fall nicht funktionieren, denn damit das funktioniert, müssen Sie wissen, welchen Werttyp Sie durchlaufen, aber die Werttypen in JSON sind nicht immer identisch. Hier
ist ein Beispiel in Spielplatz für das, was ich versuche zu erreichen:
// 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.
Ich mag würde für das unknownAttributes
Wörterbuch das age
Attribut und Wert in diesem Fall zu speichern, und anderen möglichen Wert Typen, wenn sie in Zukunft von der externen Quelle zum JSON hinzugefügt werden.
Der Grund, warum ich so etwas tun möchte, ist, dass ich die unbekannten Attribute im JSON beibehalten kann, so dass ich in einer zukünftigen Aktualisierung des Codes in der Lage sein werde, sie angemessen zu behandeln, sobald die Attributschlüssel bekannt sind .
Ich habe viel über StackOverflow und Google gesucht, bin aber noch nicht auf diesen einzigartigen Fall gestoßen. Danke im Voraus!