我正在尝试找到解析嵌套 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"
]
}
]
}
这是我的鸟类类:
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
}
}
这是我的数据服务:
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
并将其显示在表格上呢?如果已经有一个明确的例子,请纠正我。
我知道有很多第三方可以提供帮助,例如 SwiftyJSON 和 Gloss,但我想以标准方式理解它。
最佳答案
我认为根据你的 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)
}
}
}
关于ios - 使用数据模型正确解析嵌套的 JSON 以进行多次重用。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46602937/