json - Swift 无法解析 NSMutableDictionary 中的整数

标签 json swift

我有 NSDictionary 打印描述为

{
    accStatus = 2;
    accessKey = "55d66e4d4f740-c24aa8ef3a28564db5a2bf77c8638478-712675299";
    email = "abc@yahoo.com";
    id = 15;
    imagePath = "";
    name = "Umar";
    notifStatus = 0;
    phone = 923217268138;
}

我正在尝试按照以下代码进行解析

init (user: AnyObject)
{
    self.id         = (user["id"] as? Int) ?? 0

    self.accStatus  = (user["accStatus"]  as AnyObject? as? Int) ?? 0

    self.accessKey  = (user["accessKey"] as AnyObject? as? String) ?? "" // to get rid of null
    self.name       = (user["name"] as AnyObject? as? String) ?? "" // to get rid of null     
}

然而它对所有整数返回 0。如果我尝试删除条件 ??并替换为!它给我错误

Could not cast value of type '__NSCFString' (0x24807ac) to 'NSNumber' (0x28d96dc).

AnyObject NSMutableDictionary 明明是整数,我怎么解析整数

最佳答案

您不能信任 print 来揭示字典中值的类型。考虑这个例子:

var user1: NSMutableDictionary = [
    "id1" : "1",
    "id2" : 2,
    "id3" : 3.141592654
]

for (key, value) in user1 {
    var type: String

    switch value {
    case let i as NSNumber:
        type = "NSNumber"
    case let s as NSString:
        type = "NSString"
    default:
        type = "something else"
    }

    print("\(key) is \(type)")
}

id1 is NSString
id2 is NSNumber
id3 is NSNumber

print(user1)

{
id1 = 1;
id2 = 2;
id3 = "3.141592654";
}

注意 id1 是一个 NSStringid2 是一个 NSNumber 并且都没有引号 “”id3 是一个 NSNumber,带有引号。

因为 (user["id"] as? Int)! 给出错误:

Could not cast value of type '__NSCFString' (0x24807ac) to 'NSNumber' (0x28d96dc)

底层类型是 NSString,在有条件地将它们转换为 String 之后需要将其转换为 Int:

对于 Swift 1.2:

self.id         = (user["id"] as? String)?.toInt() ?? 0
self.accStatus  = (user["accStatus"] as? String)?.toInt() ?? 0
self.accessKey  = (user["accessKey"] as? String) ?? ""
self.name       = (user["name"] as? String) ?? ""

请注意 (user["id"] as?String)?.toInt() ?? 0 使用 Swift 语言的多项功能来防止崩溃:

  1. 如果 "id" 不是 user 字典中的有效键,user["key"] 将返回 nil 。使用 as?nil 转换为 String 将返回 nil可选链 ? 将只返回 nil 而不是调用 toInt() 最后 nil 合并operator ?? 会将其转换为 0
  2. 如果 user["id"] 实际上是另一种类型,那么 as? String 将返回 nil 并且将变为 0 如上所述。
  3. 如果 user["id"] 是一个 String,它不会转换为 Int,例如 "two",然后 toInt() 将返回 nil,其中 ?? 将转换为 0。<
  4. 最后,如果 user["id"] 是转换为 IntString,则 toInt() 将返回 Int?(可选 Int),?? 将解包

对于 Swift 2.0:

self.id         = Int(user["id"] as? String ?? "") ?? 0
self.accStatus  = Int(user["accStatus"] as? String ?? "") ?? 0

像上面的 Int(user["id"] as?String ?? "") ?? 0 使用 Swift 语言的多项功能来防止崩溃:

  1. 如果 "id" 不是 user 字典中的有效键,user["key"] 将返回 nil 。使用 as?nil 转换为 String 将返回 nilnil 合并运算符 ?? 会将其转换为 ""Int("") 将返回 nil,第二个 ?? 将合并为 0
  2. 如果 user["id"] 是另一种类型,那么 as? String 将返回 nil 并且将变为 0 如上所述。
  3. 如果 user["id"] 是一个 String 而不是一个 Int,那么 Int() 将返回 nil?? 将转换为 0
  4. 最后,如果 user["id"] 是转换为 IntString,则 Int() 将返回 Int?(可选 Int),?? 将解包。

关于json - Swift 无法解析 NSMutableDictionary 中的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130952/

相关文章:

javascript - 下载文件时在文件内容中获取类型 [object object],而不是使用 angular 7 的 blob

swift - 如何从选择器中获取值(或索引)并将其与实体属性的值进行比较?

javascript - 循环遍历一个数组,将每个项目添加到一个对象并将其推送到 Javascript 中的数组

javascript - 以更简单的方式获取树数据结构的深度

swift - 从 UISearchBar 更改 UIBarButtonItem

swift - 仅使用用户的 objectId 检索用户的数据 - Parse & Swift

ios - ARKit 中带有动画的 .fbx 文件

arrays - 在 Swift 3 中加载数据时为空数组

python - 如何使用 Python 在 key 未知时解析 Json?

javascript - 如何将 json 编码的 php 变量转换为同一文件中的 JavaScript JSON 对象