使用数据模型正确解析嵌套的JSON以进行多次重用。 迅速

我正在尝试找到解析嵌套JSON的最佳解决方案。 我知道有很多方法可以解析JSON,但我被告知最好的做法是为我希望提取的数据建立一个Class / Struct模型。

以下是JSON数据示例:

{ "description": "Birds of Antarctica, grouped by family", "source": "https://en.wikipedia.org/wiki/List_of_birds_of_Antarctica", "birds": [ { "family": "Albatrosses", "members": [ "Wandering albatross", "Grey-headed albatross", "Black-browed albatross", "Sooty albatross", "Light-mantled albatross" ] }, { "family": "Terns", "members": [ "Arctic tern", "Antarctic tern" ] } ] } 

这是我的Birds类:

 class Birds { let family: String? let members: String? init?(json: JSON) { guard let family = json["family"] as? String, let members = json["members"] as? String else { return nil } self.family = family self.members = members } } 

这是我的DataService:

 typealias JSON = [String: Any] class DataService { private init() {} static let shared = DataService() func getData(completion: (Data) -> Void) { guard let path = Bundle.main.path(forResource: "bird_data", ofType: "json") else {return} let url = URL(fileURLWithPath: path) do { let data = try Data(contentsOf: url) completion(data) } catch { print(error.localizedDescription) } } 

最后这是我在viewController中调用它的方式:

 func getData() { DataService.shared.getData { (data) in do { guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return } print(json) } catch { print(error) } } } 

那么我怎样才能打印出这个family并将其显示在桌子上呢? 如果已经有一个明确的例子,请纠正我。

我知道有很多第三方帮助像SwiftyJSONGloss,但我想以标准的方式理解它。

我认为根据你的json的结构,你需要形成两个模型类,一个用于整个json,一个用于单个鸟,所以你可以这样做:

 class Bird { let family: String? let members: [String]? init?(json: JSON) { guard let family = json["family"] as? String, let members = json["members"] as? [String] else { return nil } self.family = family self.members = members } } class JsonData { var birds: [Bird]? var description: String? var sourceUrl: String? init?(json: JSON) { guard let description = json["description"] as? String, let sourceUrl = json["source"] as? String, let birds = json["birds"] as? [JSON] else { return nil } self.description = description self.sourceUrl = sourceUrl self.birds = [Bird]() for singleBird in birds { let singleBirdObj = Bird(singleBird) self.birds?.append(singleBirdObj) //you can add birds to shared manager array like this (after discussion with OP) BirdManager.shared.appendBird(singleBirdObj) } } } func getData() { DataService.shared.getData { (data) in do { guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return } let jsonDataObject = JsonData(json) //here you have jsonDataObject that has all the json data print(print(jsonDataObject?.description)) } catch { print(error) } } } 

如果你使用的是Swift 4,你可以像这样使用Codable协议:

 struct Bird: Codable { let family: String let members: [String] } struct Root: Codable { let description: String let source: URL let birds: [Bird] } 

您可以在Swift Playground中尝试这样:

 let jsonData = """ { "description": "Birds of Antarctica, grouped by family", "source": "https://en.wikipedia.org/wiki/List_of_birds_of_Antarctica", "birds": [ { "family": "Albatrosses", "members": [ "Wandering albatross", "Grey-headed albatross", "Black-browed albatross", "Sooty albatross", "Light-mantled albatross" ] }, { "family": "Terns", "members": [ "Arctic tern", "Antarctic tern" ] } ] } """.data(using: .utf8)! let decoder = JSONDecoder() let parsedObject = try decoder.decode(Root.self, from: jsonData) 

您可以在此处阅读有关Swift 4 Codable协议的更多信息(例如自定义键,自定义日期解析等): http ://benscheirman.com/2017/06/ultimate-guide-to-json-parsing-with-swift-4 /