Codable 句柄单个或数组

Codable Handle Single or Array

当数组包含一个元素时,我们的 API 在数据中发送单个对象:

{
  "data":{
    "name":"ABC",
    "age":"26"
  }
}

但是当数组中有更多元素时,响应在数组中

{
  "data":[{
    "name": "ABC",
    "age" : "26"
  },
  {
    "name": "XYZ",
    "age" : "22"
  }]
}

对我来说似乎是一个糟糕的API设计。

你的 API 应该 return 在你的 data 字段中的一个数组,无论计数是多少。

{ "data":[{ "name": "XYZ", "age" : "22" }] }

{ "data":[{ "name": "ABC", "age" : "26" }, { "name": "XYZ", "age" : "22" }] }

这样做

struct Root  : Codable {

   let data:[DItem]

   init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    do {
         data = try container.decode([DItem].self, forKey: .data)
    }
    catch {
         let res = try container.decode(DItem.self, forKey: .data)
        data = [res]
    }

 }
}

struct DItem: Codable {
   let name,age:String 
}

let res = try JSONDecoder().decode(Root.self, from:data)

直到您修复响应