Ani*_*Dey 5 parsing json ios swift jsondecoder
我正在尝试使用解析响应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。”,底层错误:nil))
guard let obj = try? JSONDecoder().decode(ShipmentsResponse.self, from: json) else {return}
Run Code Online (Sandbox Code Playgroud)
这是我违抗的货运类
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)
}
}
Run Code Online (Sandbox Code Playgroud)
这是json
{
"ItemId": "8af66c87-9099-42a7-8a34-39def02160ac",
"VehicleName": null,
"VehicleNumber": null
}
Run Code Online (Sandbox Code Playgroud)
错误很明显。
预期的字符串值,但发现为 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)
}
}
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |