【问题标题】:How do I handle errors within a struct when parsing JSON in Swift在 Swift 中解析 JSON 时如何处理结构中的错误
【发布时间】:2022-07-27 00:45:51
【问题描述】:

我正在调用一个 API,然后使用下面的简化代码对其进行解码


guard let url = URL(string: "someURL") else {
    return
}

let task = URLSession.shared.dataTask(with: url) { data, response, error in

    let decoder = JSONDecoder()
    if let data = data {
        do {
            let results = try decoder.decode(Response.self, from: data)
            print(results)
        } catch {
            print(error)
        }
    }
}
task.resume()

Response 是我下面看到的结构

struct Response : Codable {
    let response: ResponseContents
}

struct ResponseContents : Codable {
    let result : [wantedData]
}

struct wantedData : Codable {
    let name: String
}

在大多数情况下,这很好用,但有时 API 返回的 JSON 没有名为 name 的键,而键是 otherName - 因此我得到提示“keyNotFound”的错误。

有没有一种方法可以在我的结构或解析语句中添加一个条件语句来检查是否找不到密钥,如果没有,它使用我定义的另一个?

【问题讨论】:

  • 您可以有 2 个可选属性:let name: String?; let otherName: String?,当您想要访问该属性时,您可以使用计算属性:var nameToUse: String { name ?? otherName }?

标签: json swift struct jsondecoder


【解决方案1】:

Larme 给出的解决方案也不错。

但您也可以直接将 Decodable 与 CodingKey 一起使用,更难阅读,但可重复使用。

struct DynamicKey: CodingKey {
    var stringValue: String
    init?(stringValue: String) {
        self.stringValue = stringValue
    }
}


struct wantedData : Codable {
    let name: String

 init(from decoder: Decoder) throws {
      let dynamicKeysContainer = try decoder.container(keyedBy: DynamicKey.self)
      try dynamicKeysContainer.allKeys.forEach { key in
          switch key.stringValue {
          case "name" where try dynamicKeysContainer.decode(String.self, forKey: key):
              name = $0
          case "otherName" where try dynamicKeysContainer.decode(String.self, forKey: key):
              name = $0
          default: break
          }
      }
  }
} 

我没试过。而且您可能会做得更好,只需发布​​以提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2016-02-24
    相关资源
    最近更新 更多