在什么情况下JSONSerialization.data(withJSONObject :)会抛出一个捕获错误?

时间:2015-11-07 15:37:55

标签: ios json swift cocoa

JSONSerialization.data(withJSONObject:options:)(在Swift 2中称为dataWithJSONObject)被声明为throws。但是,传递无效对象会导致崩溃,而不是导致错误的错误:

do  {
    // Crash
    try JSONSerialization.data(
        withJSONObject: NSObject(),
        options: [])
    }
catch
    {
    // Never reached
    print("Caught error:", error)
    }

为什么该方法被声明为“抛出”呢?在什么情况下会抛出异常?

不知道导致错误的原因使得很难知道如何处理错误,并且无法编写验证处理错误的测试。

1 个答案:

答案 0 :(得分:7)

原来它与this question的情况相同:你可以创建一个包含无效unicode(什么?!)的Swift字符串,这会导致异常。

let bogusStr = String(
    bytes: [0xD8, 0x00] as [UInt8],
    encoding: String.Encoding.utf16BigEndian)!

do  {
    let rawBody = try JSONSerialization.data(
        withJSONObject: ["foo": bogusStr], options: [])
    }
catch
    {
    // Exception lands us here
    print("Caught error:", error)
    }

为什么原始问题中的示例代码会崩溃,而不是抛出错误?

回复错误报告时,Apple告诉我如果您不确定该对象是否可编码,则应在JSONSerialization.isValidJSONObject(_:)之前致电data(withJSONObject:),否则将无法使用API,这就是为什么他们认为它应该崩溃而不是抛出可捕捉的东西。