当数组中的一个项引发DecodingError

时间:2017-10-25 09:21:35

标签: ios swift swift4 codable

如果其中一个对象抛出DecodingError,是否可以返回成功解码的数组对象?我正在与一个非常冗长的API进行通信,它间歇性地向我发送了一些格式错误的JSON,这会导致抛出DecodingError并且不会解析整个对象数组(包括有效条目)。

我不知道是否有某种方法可以手动完成,但是如果有一个带有一些duff数据的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)

显然是一个人为的例子,但希望能说明我的观点。如果响应数组中的对象缺少必需属性,那么我希望从解码对象列表中删除该对象,而不是轰炸并返回任何内容。

这也适用于所有其他DecodingErrors(dataCorrupted,typeMismatch,valueNotFound)。

2 个答案:

答案 0 :(得分:0)

如何使用错误处理embbeded解码每个项目的项目? 这样你的程序就会继续,而且你可以显示给定项目的解码错误。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html

答案 1 :(得分:0)

您可以自定义解码。

JSONDecoder().dataDecodingStrategy = .custom({ (decoder) -> Data in
    // custom decode
    return Data()
})

或处理意外的浮动。

JSONDecoder().nonConformingFloatDecodingStrategy = .convertFromString(positiveInfinity: "s1", negativeInfinity: "s2", nan: "s3")