【问题标题】:Fetch fields dynamically from API in SWIFT从 SWIFT 中的 API 动态获取字段
【发布时间】:2019-09-23 15:01:22
【问题描述】:

我收到来自 API 的响应,其中包含动态字段。

[{"details": { "amount": "11"},
  "wallet":"MAIN"},
 {"details": { "bonus": "12"},
 "wallet":"POKER"}]

我希望能够访问每个对象的 ,,details`` 字段。 我试过了

if let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) as? Array<[String: Any]> { 
completion(.success(jsonObject))}

【问题讨论】:

  • 您可以将 details 对象建模为一个符合 decodable 的结构,并使用 let amount: Int?let bonus: Int? 等可选成员,然后使用 JSONDecoder.decode 方法。
  • “details”的内容有多动态,它可以包含多个值还是只有一个键/值对?值的类型总是字符串吗?
  • @JoakimDanielson,它可以包含许多值,但类型始终是字符串。该解决方案必须能够处理新字段(如果要添加),而无需更改代码

标签: arrays swift api dictionary completion


【解决方案1】:

这里最简单的解决方案是使用Codable 并创建一个包含“动态”部分的字典的结构

struct Response: Decodable {
  let details: [String: String]
  let wallet: String
} 

然后使用JSONDecoder对其进行解码

do {
  let result = try JSONDecoder().decode([Response].self, from: data)
  print(result)
  //...
} catch {
  print(error)
}

【讨论】:

    【解决方案2】:

    最好用Codable

    struct Root: Codable {
        let details: Details
        let wallet: String
    }
    
    // MARK: - Details
    struct Details: Codable {
        let amount, bonus: String?
    }
    

    let res = try? JSONDecoder().decode([Root].self,from:data)
    print(res)
    

    【讨论】:

    • 我有另一个来自 API 的调用,告诉我应该从 ,,details 处理哪个字段。看起来像{"wallet" : "MAIN", "field": "free"}, {"wallet": "POKER", "field": "bonus"}, {"wallet": "MAIN", "field": "amount"}
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多