【问题标题】:Use nil instead of Optional(<null>) for null value in JSON在 JSON 中使用 nil 而不是 Optional(<null>) 作为空值
【发布时间】:2014-08-15 04:28:04
【问题描述】:

在 Swift 中,NSJSONSerialization.JSONObjectWithData 使用 Optional(&lt;null&gt;) 作为 JSON 中的 null 值。是否可以告诉解析使用nil 代替(即,删除具有null 值的字段,因为Swift Dictionary 不允许nil 值)?

【问题讨论】:

  • 顺便说一句,Optional(&lt;null&gt;) 实际上是什么?包裹在可选项中的值的类型是什么?
  • 我不认为它给你一个Dictionary 对象,它给你一个NSDictionary 不是吗?由于他们无法存储nil,因此您的要求无法完成。
  • 是的,Swift 将NSDictionary 连接到[NSObject: AnyObject]。由于Dictonary不能存储nil,所以他们使用NSNull
  • Dictionary 无法存储 nil。当您将nil 分配给一个字段时,您可以有效地删除该字段。 var a = ["x": 1, "y": 2]; a["x"] = nil; println(a.count) 打印 1。我使用 xcode6-beta5。
  • @Ethan:不正确。如果字典的值类型是可选类型,则字典可以存储nilvar a: [String: Int?] = ["x": 1, "y": 2]; a["x"] = (nil as Int?); println(a.count) 打印2。 (请注意,我不做a["x"] = nil,因为下标运算符采用值类型的可选项,在本例中为Int??。如果是nil,则意味着删除键;如果不是@987654348 @它存储它。但是如果你只写nil,它将被解释为Int??nil(nil as Int?)强制它转换为非nilInt??包含nil@987654356 @.)

标签: json swift


【解决方案1】:

Optional() 是一个NSNull 值。你可以避免这样的错误:

if !(myField is NSNull) {
    //Whatever you want to do with myField when not null
} else {
    //Whatever you want to do when myField is null
}

【讨论】:

    【解决方案2】:

    NSJSONSerialization 使用NSNull 对象,这就是您所看到的;您可以通过与NSNull() 进行比较来简单地检查它们。

    【讨论】:

    • 那很难看。我有一个大的 json 对象,它的值可以是字符串或 null。因此,我不必将整个内容转换为[String : String],而是必须使用[String : AnyObject],并且每次我需要访问一个字段时,我都必须编写value = (dict["field1"] == nil || dict["field1"] is NSNull) ? nil : (dict["field1"]! as String)之类的东西,而不仅仅是value = dict["field1"]
    • @Ethan 我不确定您是否在这里提出单独的问题,但是如果不将所有内容都包含在 Optional 中,则没有好方法可以包含 nil;特别是由于 NSJSONSerialization 是一个 Obj-C 类,它没有 Optional,必须使用 NSNull。如果你想从字典中过滤 NSNulls,你可以编写一个简单的扩展或全局函数来实现。
    • @Ethan 解析时,如果您知道可以有 nil 值,则转换为 [String: String] 永远不会安全。当属性可以作为属性而不是字符串键访问时,最好将字段单独解析到自定义结构/类中。此外,简单的类型安全模式是value = dict["field1"] as? String,您不必专门检查NSNull。检查您想要的类型。
    【解决方案3】:

    我会说这是您的 JSON 架构的问题。 null 和 string 是 JSON 中不同类型的事物。在我看来,您的密钥的值有时为空,有时为字符串,这一事实似乎表明你们没有遵循严格的模式。

    一个好的设计应该有键或者不存在,或者如果存在,它的值保证是一个字符串。在 Swift 中访问字典键会产生一个可选参数,如果键不存在则为 nil,如果键存在则为值(在这种情况下,您知道它是一个字符串),这与您想要的匹配。

    【讨论】:

    • 这是不正确的。 Null 表示没有值。省略值只是意味着同样的事情。
    • @GregBrown:不,不是。 Null 是 JSON 中的一种值。
    • Null 是 JSON 中可能的 。它不是一种类型。根据定义,空值没有类型。根据您的逻辑,JSON 文档应该定义一个值为 null 或不存在的键。没有实际的用例。
    • @GregBrown:不管您个人使用 null 的理念如何,关键是,JSON 规范对待值为 null 的键与不存在的键和所有 JSON 实现库非常不同同样以不同的方式对待它们。它们并不“仅仅意味着同一件事”。
    • JSON 规范没有说明应该如何处理 null。它只是将其定义为有效值之一。但无论哪种方式,您的建议仍然没有任何意义。当然,定义一个包含可能存在或不存在的值的“模式”是有效的!否则,例如,我们不会在 SQL 中拥有可为空的列或在 Swift 中拥有可选类型。出于所有实际目的,缺少可选值通常由 null 表示。
    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 2022-11-06
    • 2017-01-09
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多