簡單的 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 }

現在你已經獲得了字典陣列,你可以使用 flatMapTodo 物件中轉換每個字典(它將自動從陣列中刪除 nil 值)

let todos: [Todo] = todosDictionary.flatMap { Todo.from(json: $0) }