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