简单的 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) }