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)
直到您修复响应
当数组包含一个元素时,我们的 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)
直到您修复响应