查看SwiftyJSON字典是否具有密钥的最佳实践

时间:2014-12-16 23:05:59

标签: swift swifty-json

我试图找到一种方法来获取SwiftyJSON字典中的键值并返回默认字符串(如果未设置该键)。以下示例运行正常,但我并不满意。你知道更优雅的方式吗?

实施例

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": "three"]
]

for (key: String, user: JSON) in users {      
    println(user.object.objectForKey("name") != nil
        ? user["name"].stringValue
        : "default")
}

5 个答案:

答案 0 :(得分:26)

SwiftyJSON的latest版本具有exists()功能。

注意:他们最新的文档并没有很好地反映代码...实际方法是exists()

// Returns boolean

json["name"].exists()

答案 1 :(得分:9)

看来,当error不存在密钥时,SwiftyJSON会设置subscript属性。

所以,这应该有效:

for (key: String, user: JSON) in users {
    let name = user["name"];
    println(name.error == nil ? name.stringValue : "default")
}

例如:w / Version 6.1.1(6A2006),SwiftyJSON github current master:

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": NSNull()],
    ["id": 4, "name": "four"],
]

for (key: String, user: JSON) in users {
    let name = user["name"];
    name.isEmpty
    println(name.error == nil ? name.stringValue : "default")
}

打印:

one
default

four

答案 2 :(得分:6)

如果您需要检查SwiftyJSON字典是否有密钥,可以将其与JSON.null进行比较,如下所示:

user["name"] == JSON.null // true if the key does not exist

使用该方法,您的代码可能如下所示:

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": "three"]
]

for (key, user) in users {
    print(user["name"] != JSON.null ? user["name"].stringValue : "default")
}

如果您只想提供默认值,那么您可以使用Swift中的Nil Coalescing Operator??),如下所示:

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": "three"]
]

for (key, user) in users {
    print(user["name"].string ?? "default")
}

SwiftJSON提供string方法,该方法返回一个可选值(String?),与stringValue相反,后者始终返回String

答案 3 :(得分:1)

JSON类型的对象具有名为null的计算属性。如果请求的元素不存在,则返回NSNull,如果是,则返回nil。因此,您可以通过从其父JSON中提取特定对象并测试以查看是否存在null属性来测试是否存在特定对象。我亲自处理它:

let object = json["key"]
if object.null == nil {
    // Do something with 'object'
} else {
    // Key does not exist - handle the error
}

在您的具体情况下,您可以使用:

for (key: String, user: JSON) in users {
    let name = user.object.objectForKey("name")
    println(name.null == nil ? name.stringValue : "default")
}

...但是因为我们知道我们正在寻找一个字符串,所以我们可以进一步减少它。您实际需要做的就是删除stringValue的“值”部分,因为string如果无法从其内容生成字符串,则返回nil。另外,请查看nil coalescence运算符??。它旨在为可选变量提供默认值,请尝试以下操作:

for (key: String, user: JSON) in users {
    println(user["name"].string ?? "default")
}

美观而紧凑!

答案 4 :(得分:-1)

注意:此答案不再有效

似乎完全使用if let语法。因为访问下标将返回一个可选项,所以将其绑定到if let块中的变量。这将告诉你密钥是否在JSON

if let name = user["name"] {    // returns optional
    // user["name"] was non-nil, is now stored in ``name""
    // do something with ``name""
} 
else {
    // user did not have key "name"
    // here would be the place to return "default"
    // or do any other error correction if the key did not exist
}