为什么从JSON返回的值与NSNull不可比?

时间:2017-11-01 18:28:45

标签: json swift binary-operators

我通过Swift 4 JSON Codable方法从API返回String值。

我知道很少有值" null"或者为零,所以为了避免崩溃,我试图实现代码。以下是给出主题错误的代码(在NSNull比较中):

if Cur[indexPath.row].cap == nil || Cur[indexPath.row].cap == NSNull {
    print("Could not find the value")
    CapVal = "N/A"
} else {
    CapVal = Cur[indexPath.row].cap!
}

错误:

二元运算符' =='不能应用于' String?'类型的操作数?和' NSNull.Type

我也尝试将其转换为字符串:Cur[indexPath.row].cap as? String仍然遇到同样的错误。

1 个答案:

答案 0 :(得分:1)

如果您使用的是JSONDecoder,则明确指定为null的缺失值和值都将返回为nil

考虑这个JSON:

{"foo": "a", "bar": null}

这是struct

struct Result: Decodable {
    var foo: String
    var bar: String?
    var baz: String?
}

如果您使用JSONDecoder,则可以执行以下操作:

guard let result = try? JSONDecoder().decode(Result.self, from: data) else { ... }

let bar = result.bar ?? "N/A"

我知道您在Swift 4中询问Codable,但仅供参考,如果您使用JSONSerialization,理论上您可以测试null,因为{{ 1}} JSONSerialization值返回为null

NSNull

就个人而言,我只是选择强制转换为字符串并使用guard let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any] else { ... } let bar = json["bar"] if bar == nil || bar is NSNull { // bar was either not found or `null` } else { // bar was found and was not `null` } 合并运算符,如果转换失败,例如。

nil

但是,对于Swift 4' let bar = (json["bar"] as? String) ?? "N/A" 来说,这一切都没有用。