Dynamický slovník název dekodér JSON

hlasů
1

Swift 4. Jsem ve velmi podobné situaci, než Použití kodovatelnou na dynamickém typu / objektu , ale pro mě je změna proměnná je název slovníku a nikoli klíče uvnitř. Vypadá to, že :

{
    customName: {
        constantKey: Double,
        constantKey2: Double,
    }
}

Zde je kód jsem se snaží změnit, bylo navrženo jako odpověď na druhou otázku a já jsem málo změn:

 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 customName: [String: Double]

    private enum CodingKeys: String, CodingKey {
        case customName
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

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

A tady je zřejmá chyba jsem dostal jako já nevím, jak změnit toto uživatelské jméno: keyNotFound(Testapp.MyModel.(CodingKeys in _7A951077E4B6EF2E56D367C5DE0BF0AC).customName, Swift.DecodingError.Context(codingPath: [], debugDescription: Cannot get KeyedDecodingContainer<GenericCodingKeys> -- no value found for key \customName\, underlyingError: nil))

Položena 15/03/2018 v 18:44
uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Pokud již víte, všechny klíče ve vnitřní JSON, použijte struct využít statické psaní. Za předpokladu, že existuje pouze jeden klíč na nejvyšší úrovni ve své JSON (váš customNameklíč):

struct MyModel: Decodable {
    struct InnerModel: Decodable {
        var constantKey1: Double
        var constantKey2: Double
    }

    var customName: InnerModel

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: GenericCodingKeys.self)

        // Assume that there's only 1 key at the top level in the JSON
        if let key = container.allKeys.first {
            customName = try container.decode(InnerModel.self, forKey: key)
        } else {
            throw NSError(domain: NSCocoaErrorDomain, code: 0, userInfo: [NSLocalizedDescriptionKey: "JSON is empty"])
        }
    }
}
Odpovězeno 15/03/2018 v 20:34
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more