繁体   English   中英

在IOS中解析Json响应时出现valueNotFound错误

[英]valueNotFound error while parsing Json response in IOS

我试图使用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:“预期的字符串值但是找到了null。”,underlyingError:nil))

guard let obj = try? JSONDecoder().decode(ShipmentsResponse.self, from: json) else {return}

这是我藐视的货运类

class ShipmentResponse : Codable {

    var ItemId: String = ""
    var VehicleName: String  = ""
    var VehicleNumber: String  = ""

    convenience required init(from decoder: Decoder) throws
    {
        self.init()
        let values = try decoder.container(keyedBy: CodingKeys.self)
        ItemId = try values.decode(String.self, forKey: .ItemId)

        do {
            _ = try values.decode(String.self, forKey: .VehicleName)
        } catch {
            print(error)
        }

        VehicleName = try values.decode(String.self, forKey: .VehicleName)
        VehicleNumber = try values.decode(String.self, forKey: .VehicleNumber)
    }

}

这是json

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

错误非常清楚。

预期的字符串值,但发现为null

预期值是字符串,但我们在响应中变为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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM