如果其中一个对象抛出解码错误,是否可以返回数组的成功解码对象?我正在与一个相当棘手的 API 进行通信,该 API 间歇性地向我发送一些格式错误的 JSON,导致抛出解码错误并且整个对象数组(包括有效条目)未被解析。
我不知道是否有某种方法可以手动完成,但是给定一个包含一些达夫数据的 JSON 数组,我想以某种方式仍然获取可以成功解码的对象。
编辑:根据要求,代码示例:
let json = """
[
{"prop1": 1, "prop2": 2, "prop3": 3},
{"prop1": 1, "prop2": 2, "prop3": 3},
{"prop1": 1, "prop2": 2}
]
""".data(using: .utf8, allowLossyConversion: false)!
struct MyStruct: Codable {
let prop1: Int
let prop2: Int
let prop3: Int
}
// Throws keyNotFound (uncaught obviously) and returns nil because prop3 in 3rd object is missing
let decoded = try? JSONDecoder().decode(MyStruct.self, from: json)
显然是一个人为的例子,但希望能说明我的观点。如果响应数组中的对象缺少强制属性,那么我希望将该对象从解码对象列表中删除,而不是轰炸并返回任何内容。
这也适用于所有其他解码错误(dataCorrupted,typeMismatch,valueNotFound)。
如何解码每个项目并嵌入错误处理?这样,您的程序将继续,而且您可能会显示给定项目的解码错误。
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html
您可以自定义解码。
JSONDecoder().dataDecodingStrategy = .custom({ (decoder) -> Data in
// custom decode
return Data()
})
或者处理意外的浮动。
JSONDecoder().nonConformingFloatDecodingStrategy = .convertFromString(positiveInfinity: "s1", negativeInfinity: "s2", nan: "s3")