【问题标题】:Swift: JSON unexpected error with nil second level elementSwift:JSON 意外错误,二级元素为零
【发布时间】:2015-10-04 07:47:27
【问题描述】:

我在尝试创建 JSON 对象时遇到问题。 一切都很好,直到我尝试创建具有 nil 值的二级元素:

var json = [String: AnyObject]()
json["id"] = 1234567

let secondLevel : [String: AnyObject] = ["i1": 12, "i2": "not nil"]
json["secondLevel"] = secondLevel

这很好,但如果我尝试:

let secondLevel : [String: AnyObject?] = ["i1": 12, "i2": nil]
json["secondLevel"] = secondLevel

我收到以下错误:

无法将“[String : AnyObject?]”类型的值分配给 输入“AnyObject?”

这是什么意思? [String:AnyObject?] 不是 AnyObject 类型吗?

我可以做些什么来避免这个错误?

【问题讨论】:

  • 我尝试了json["secondLevel"] = secondLevel as? AnyObject,但将整个secondLevel 对象设为零,所以不好
  • 我不知道元素的先验值,null是JSON标准中的值。顺便说一句,我不明白你之前的评论

标签: ios swift


【解决方案1】:

您可以使用 Any 代替 AnyObject

Any 和 AnyObject 的类型转换

Swift 提供了两个特殊的类型别名来处理非特定类型:

AnyObject 可以表示任何类类型的实例。 Any 可以表示任何类型的实例,除了函数类型。

注意: 仅当您明确需要它们提供的行为和功能时才使用 Any 和 AnyObject。最好具体说明您希望在代码中使用的类型。

来自The Swift Programming Language

var json = [String: Any]()
json["id"] = 123452

let secondLevel : [String: Any?] = ["i1": 12, "i2": nil]
json["secondLevel"] = secondLevel

print(json)

【讨论】:

  • 因为我使用外部库(Alamofire),所以我必须使用 [String: AnyObject],这是一个先决条件。
  • @AntonioRomano 您是在尝试创建要发送的 JSON 字典,还是在谈论解析 JSON?
  • 创建 JSON,如示例中所示
【解决方案2】:

您可能应该查看以下链接:

他们在这里提到了为什么您的代码不起作用。第一个链接演示了如何正确创建包含多个嵌套字典的字典对象。

第二个链接将告诉您为什么您的代码不起作用。似乎字典对象是一个结构,而不是一个类。结构不继承自 AnyObject 类。因此,您不能将字典转换为 AnyObject 对象。也许您应该按照第二个链接中的建议使用 NSDictionary 对象。

我所说的使用 NSDictionary 是什么意思:

var secondLevel: NSDictionary = [
    "i1" : 12,
    "i2" : "not nil"
]

var json: [String: AnyObject] = []
json["id"] = 1234567
json["secondLevel"] = secondLevel

【讨论】:

  • 由于我使用外部库 (Alamofire) 我必须使用[String: AnyObject],这是一个前提条件。
  • 因此,与其尝试将嵌套字典 (struct -> [String : AnyObject]) 放入 AnyObject,不如使用 NSDictionary。请注意,如果您尝试将对象添加到 NSDictionary,则必须改用 NSMutableDictionary。
【解决方案3】:

关键不是使用 Any 而不是 AnyObject,我无法更改类型。 解决方案是使用一个对象来操作 nil 值,例如:

let secondLevel : [String: AnyObject] = ["i1": 12, "i2": NSNull()]
json["secondLevel"] = secondLevel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多