【发布时间】:2015-10-10 08:24:50
【问题描述】:
我在 Swift 1.2 中使用 NSJSONSerialization 来解析从 API 响应返回的一些 json。
var err: NSError?
let opts = NSJSONReadingOptions.AllowFragments
let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData!, options: opts, error: &err)
解析后的 json 以AnyObject? 的形式提供。我想用这个可选来初始化一个类对象,它可以用作应用程序中的模型数据。
class Alerts {
let type: String
let date: String
let description: String
let expires: String
let message: String
init(json: AnyObject) {
if let
jsonDict = json as? [String: AnyObject],
alertsArray = jsonDict["alerts"] as? [AnyObject],
alertsDict = alertsArray[0] as? [String: AnyObject],
type = alertsDict["type"] as? String,
date = alertsDict["date"] as? String,
description = alertsDict["description"] as? String,
expires = alertsDict["expires"] as? String,
message = alertsDict["message"] as? String
{
self.type = type
self.date = date
self.description = description
self.expires = expires
self.message = message
}
else
{
self.type = "err"
self.date = "err"
self.description = "err"
self.expires = "err"
self.message = "err"
}
}
}
// example of creating a data model from the json
let alerts = Alerts(json: json!)
alerts.type
alerts.date
alerts.description
alerts.expires
alerts.message
由于NSJSONSerialization 返回一个可选值,因此我必须在提取 json 数据时检查每个值类型是否存在。正如您在上面的代码中看到的,我使用 Swift 1.2 中改进的可选绑定来清理 init 方法。在不使用第三方库的情况下,我还能对类模型(enums、structs、type aliases)做些什么来使其更具可读性?我应该为模型数据使用struct 而不是class?是否可以使用enum 或struct 创建自定义类型来表示json 对象?
【问题讨论】:
-
我知道你提到你不想使用第三方库,但我真的认为你应该看看 SwiftyJSON。它会为您检查所有内容并为您提供嵌套字典。就个人而言,然后我会使用它来使用 Structs 将 JSON 映射到一个 swift 模型,在 init 中分配数据并嵌套 Structs,从诸如“Root()”之类的东西开始,然后从那里向下。
-
@Cole 我知道 SwiftyJSON 和 Argo,但我不想依赖它们。不过,为 swift 模型使用
struct而不是class可能是个好主意。
标签: json swift enums optional nsjsonserialization