当前位置: 首页 > 知识库问答 >
问题:

为什么从JSON返回的值无法与NSNull相比?

燕寒
2023-03-14

我通过Swift 4 JSON可编码方法从API返回字符串值。

我知道很少有值是“null”或nil,所以为了避免崩溃,我正在尝试实现代码。以下是给出主题错误的代码(在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的操作数。类型

我也尝试将其转换为字符串:Cur[indepath.row]。cap组件?字符串仍然出现相同的错误。


共有1个答案

隆兴修
2023-03-14

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

考虑以下JSON:

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

这个结构:

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中的Coable,但仅供您参考,如果您使用JSONSeriize,但是,理论上您可以测试null,因为JSONSeriize确实将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` 
}

但就我个人而言,如果强制转换失败,我会选择强制转换为字符串并使用聚合操作符,例如。

let bar = (json["bar"] as? String) ?? "N/A"

但是,这对于Swift 4的JSONDecoder来说是没有实际意义的。

 类似资料:
  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 我最近一直在搞弄api,发现有些奇怪的地方。 返回一个对象。输出 但是,如果将其写为: 这是您可以访问标题属性的标准。 所以我的问题是:为什么要在对象文字中返回一个promise,但是如果刚返回则返回一个值? 问题答案: 为什么要兑现承诺? 因为您在所有标头到达后立即收到。调用使您对尚未加载的http响应的正文有了另一个保证。另请参见[为什么来自JavaScriptfetch API的

  • 问题内容: 检查以下代码段: http://play.golang.org/p/xusdITxgT- 为什么会这样呢?因为我的论点之一必须是切片地址。 也许我没有对每个人都说清楚。 上面的代码就是为什么我需要一个分片地址。 结果变量在这里是我需要的。现在通常我可以做到 但是现在SomeStruct是动态的,我需要使用reflect.MakeSlice创建切片 而且它在上出错:结果必须是一个分片地址

  • 我正在做一个练习游戏。 我有一个Spring引导/Maven项目连接到MySQL数据库。我能够设置一个api,它只是从我的“所有谜语”表中检索所有内容。它以前工作过,但是现在api返回一个json,其中一些键的值为空。我唯一玩的是Spring引导文件上的application.properties。我在spring.jpa.hibernate.ddl的“更新”和“无”之间跳跃。我到底做错了什么?

  • 我在客户端使用vue、vue路由器,在服务器端使用express、morgan(MEVN应用程序) 在客户端我用vue cookie设置cookie 在服务器端,我使用CookieParser 所以,在应用程序。我有这样的代码 并且,在文件中,我有这样一个GET请求的代码 问题是,var loginHash=req.cookies['Login'];总是返回未定义的,即使我有登录cookie 添加

  • 问题内容: 我经常看到这样的代码(C,C ++,有时甚至是Java): 我看不到这些括号有任何好处。所以我的问题是,程序员是否假定函数是某种以返回值作为参数的函数,或者确实有这些括号有意义的情况吗? 我了解这里已经提出了类似的问题,但这仅与ANSI C有关。我想知道是否存在某些特定于C ++或Java的方面尚未得到解答。 问题答案: 关于C 括号放在有表达式的位置,并且希望返回值是表达式的值。 即