簡單的 JSON 解析到自定義物件
即使第三方庫是好的,協議也提供瞭解析 JSON 的簡單方法你可以想象你有一個物件 Todo
as
struct Todo {
let comment: String
}
每當你收到 JSON 時,你可以使用 NSJSONSerialization
物件處理普通 NSData
,如另一個示例所示。
之後,使用簡單的協議 JSONDecodable
typealias JSONDictionary = [String:AnyObject]
protocol JSONDecodable {
associatedtype Element
static func from(json json: JSONDictionary) -> Element?
}
讓你的 Todo
結構符合 JSONDecodable
就可以了
extension Todo: JSONDecodable {
static func from(json json: JSONDictionary) -> Todo? {
guard let comment = json["comment"] as? String else { return nil }
return Todo(comment: comment)
}
}
你可以使用此 json 程式碼嘗試:
{
"todos": [
{
"comment" : "The todo comment"
}
]
}
當你從 API 獲取它時,你可以將其序列化為 AnyObject
例項中顯示的先前示例。之後,你可以檢查例項是否是 JSONDictionary
例項
guard let jsonDictionary = dictionary as? JSONDictionary else { return }
要檢查的另一件事,特別針對這種情況,因為你在 JSON 中有一個 Todo
陣列,是 todos
字典
guard let todosDictionary = jsonDictionary["todos"] as? [JSONDictionary] else { return }
現在你已經獲得了字典陣列,你可以使用 flatMap
在 Todo
物件中轉換每個字典(它將自動從陣列中刪除 nil
值)
let todos: [Todo] = todosDictionary.flatMap { Todo.from(json: $0) }