【问题标题】:valueNotFound error while parsing Json response in IOS在 IOS 中解析 Json 响应时出现 valueNotFound 错误
【发布时间】:2019-05-01 07:49:43
【问题描述】:

我正在尝试使用 JSONDecoder 解析响应。如果对应的key有value则编译成功,但是如果key有null值则编译失败,报如下错误。

valueNotFound(Swift.String, Swift.DecodingError.Context(codingPath: [编码键(字符串值:“结果”,intValue:无), _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}

这是我拒绝的 Shipment 类

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
}

【问题讨论】:

    标签: ios json swift parsing jsondecoder


    【解决方案1】:

    错误很明显。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多