在SwiftyJSON中处理可选元素的最佳方法是什么?

时间:2014-12-17 04:47:02

标签: json swift swifty-json

我使用的是SwiftyJSON(https://github.com/SwiftyJSON/SwiftyJSON)。假设我有两种格式之一的JSON响应:

{
    "id": 1,
    "foo": "bar"
}

或者

{
    "id": 1,
    "foo": "bar",
    "user": {"id": 2}
}

我想更新我的Swift对象"用户"属性仅在"用户" JSON中的元素存在。现在我正在这样做:

let userJson = json["user"]
if userJson.type != .Null && userJson.type != .Unknown {
    user = User.create(userJson)
}

有没有更好的方法来解决这个问题?比方说,使用Swift的if-let语法?

2 个答案:

答案 0 :(得分:2)

我想不出比你正在做的更优雅的方式,但另外我做的是在构造函数中移动我的检查。我为我的实现所做的是每个可以反序列化为数据传输对象的类,我必须为将字典作为参数的构造函数提供实现。字典是来自API的json。我显然在我的代理层中确保它确实可以反序列化,不是null,并且可以表示为字典。

因为我知道API调用可以返回某种类型的错误响应(通常从我的代理层处理)或完全符合我对该调用所需的合同(转换为DTO)我可以对返回的内容做出一些假设。

在你有可能不回来的情况下,除非这是一个复杂的项目你可能会在你的构造函数中做出这样的检查:

 required init(dict dictionary: NSDictionary)
 {
    self.id = dictionary["id"] as Int
    self.foo = dictionary["foo"] as String
    self.user = ( (dictionary["user"] == nil) ? User() : User(dictionary["user"]))
 }

所以现在在这里,我说如果它是nil返回一个新的用户对象,但也许你想保持它为零。否则,如果不是这样,将“用户词典”(原始JSON中的一个孩子,在本例中为{“id”:2})传递给用户类构造函数,它几乎会做同样的事情,但保留用户对象

我猜用户类可能是:

 required init(dict dictionary: NSDictionary)
 {
    self.id = (dictionary["id"] as Int)
 }

答案 1 :(得分:1)

因为SwiftyJSON允许您使用对象,就好像它们存在一样(假设用户对象在返回用户对象时始终存在),您还可以使用以下内容作为检查来简化一些事情:

if let userId = json["user"]["id"].string {
  user = User.create(json["user"])
} else {
  // Do something else, or just ignore it.
}