Ошибка valueNotFound при анализе ответа Json в IOS - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь разобрать ответ, используя JSONDecoder.Если есть значение для соответствующего ключа, тогда оно идет хорошо, но если для ключа есть нулевое значение, то он не может скомпилировать со следующей ошибкой.

valueNotFound (Swift.String, Swift.DecodingError.Context (codingPath: [CodingKeys (stringValue: «Results», intValue: nil), _JSONKey (stringValue: «Index 0», intValue: 0), CodingKeys (stringValue: «VehicleName», intValue: nil)], debugDescription: »Ожидаемое строковое значение, но вместо него найден ноль. "*

{
    "ItemId": "8af66c87-9099-42a7-8a34-39def02160ac",
    "VehicleName": null,
    "VehicleNumber": null
}

1 Ответ

0 голосов
/ 29 ноября 2018

Ошибка очень ясно, что.

Ожидаемое строковое значение, но вместо него найдено значение

Ожидаемое значение - строка, но мы получаем null в ответе.Таким образом, декодер выдает ошибку, если собирается декодировать значение null в необязательный тип.Итак, обработайте это, сделав пустую строку в параметрах.

Код модели:

class ShipmentResponse : Codable {

    var itemId: String
    var vehicleName: String
    var vehicleNumber: String

    enum CodingKeys: String, CodingKey {
        case itemId = "ItemId"
        case vehicleName = "VehicleName"
        case vehicleNumber = "VehicleNumber"
    }

    required init(from decoder: Decoder) throws {

        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.itemId = try container.decodeIfPresent(String.self, forKey: .itemId) ?? ""
        self.vehicleName = try container.decodeIfPresent(String.self, forKey: .vehicleName) ?? ""
        self.vehicleNumber = try container.decodeIfPresent(String.self, forKey: .vehicleNumber) ?? ""
    }

    func encode(to encoder: Encoder) throws {

        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(itemId, forKey: .itemId)
        try container.encode(vehicleName, forKey: .vehicleName)
        try container.encode(vehicleNumber, forKey: .vehicleNumber)
    }
}

Разбор JSON:

let data = """
{
    "ItemId": "8af66c87-9099-42a7-8a34-39def02160ac",
    "VehicleName": null,
    "VehicleNumber": null
}
""".data(using: String.Encoding.utf8)!

do {
    let jsonData = try JSONDecoder().decode(ShipmentResponse.self, from: data)
    print("\(jsonData.itemId) \(jsonData.vehicleNumber)")
} catch let error {
    print(error)
}
...