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

标签 ios json swift

我正在尝试找到解析嵌套 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 并将其显示在表格上呢?如果已经有一个明确的例子,请纠正我。

我知道有很多第三方可以提供帮助,例如 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)
            }
        }
    }

关于ios - 使用数据模型正确解析嵌套的 JSON 以进行多次重用。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46602937/

相关文章:

iphone - 控制推送 View 何时返回

c# - 测试自定义 JsonConverter 时出现异常

ios - CarPlay:现在播放 "alert"可能吗?

objective-c - Xcode 是否将注释代码构建到其二进制文件中?

ios - 将手势识别器添加到 UIWindow 上添加的 View 中

ios - 如何过滤 GMSPlacesAutocompleteTypeFilter 以获取美国和加拿大的国家/地区结果

ios - 有没有办法测试涉及evaluatePolicy(:localizedReason:reply:)

json - 如何遍历 jsonb 对象数组以获取对象 Postgres 中的键值

javascript - 每个 PubNub 消息使用多个 JSON 数据对象渲染 PubNub/Eon Chart LiveStream

swift - 如何在一对多关系的 NSSet 上应用 NSSortdiscriptor 或 NSPredicate