[英]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.