23

我正在尝试找到一种方法来获取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")
}
4

6 回答 6

28

最新版的SwiftyJSON 有这个exists()功能。

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

// Returns boolean

json["name"].exists()
于 2016-04-15T20:56:06.403 回答
9

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

所以,这应该有效:

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

例如:w/ 版本 6.1.1 (6A2006),SwiftyJSON github 当前主:

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
于 2014-12-17T03:03:54.380 回答
7

如果您需要检查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.

于 2015-12-23T17:38:33.687 回答
1

类型的对象JSON有一个名为 的计算属性nullNSNull如果请求的元素不存在,则返回,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")
}

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

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

美观紧凑!

于 2015-07-01T06:16:02.837 回答
0

据我所知,这有效:

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

for jsonDict in users.arrayValue {      
    println(jsonDict["name"].string ?? "default")
}

为了解释,您希望将JSON对象转换为您期望获得的类型。如果您希望该类型始终成功(不是可选的),请使用xxxValue. 因此,我们使用arrayValue.

arrayValuereturn [JSON],我们在循环中遍历它。我们不需要对jsonDict: JSONto 对象进行大小写,因为 SwiftyJSON 足够聪明,可以假设它是来自下标运算符的 dict。

最后,尝试从字典中获取一个键,然后检查是否可以使用.string可选的字符串检索该键。使用空值合并来分配默认值。

请参阅 SwiftJSON 文档以了解stringstringValue

于 2015-09-10T10:27:34.410 回答
-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
}
于 2014-12-18T05:22:55.317 回答