【发布时间】:2021-11-19 20:12:28
【问题描述】:
我有三个 API 端点,它们产生相同的最终结构,但是从 API 接收到的完整 JSON 结构在每个端点中都有点不同。
第一个 JSON 结果
{
"tracks": [{
"name": "Never Gonna Give You Up"
}]
}
第二个 JSON 结果
{
"items": [{
"name": "Never Gonna Give You Up"
}]
}
第三个 JSON 结果
{
"items": [{
"track": {
"name": "Never Gonna Give You Up"
}
}]
}
我希望它们都像这样
{
"tracks": [{
"name": "Never Gonna Give You Up"
}]
}
为此,我使用了三种不同的结构:
第一:
struct TopHitsTrackResponse: Decodable {
var tracks: [Track]
}
第二:
struct FavoritesTrackResponse: Decodable {
var tracks: [Track]
enum CodingKeys: String, CodingKey {
case tracks = "items"
}
}
第三个是下面的代码。
我的尝试
我已经成功地使第一个和第二个 JSON 结果看起来与想要的结果完全一样。然而,第三个对我来说有点复杂。这是我尝试过但没有成功的方法。
struct NestedTrackResponse: Decodable {
let tracks: [Track]
enum CodingKeys: String, CodingKey {
case tracks = "items"
}
enum TrackKeys: String, CodingKey {
case track
}
init(from decoder: Decoder) throws {
let outerContainer = try decoder.container(keyedBy: CodingKeys.self)
let trackContainer = try outerContainer.nestedContainer(keyedBy: TrackKeys.self,
forKey: .tracks)
self.tracks = try trackContainer.decode([Track].self, forKey: .track)
}
struct Track: Decodable {
var name: String
}
}
我正在用这个函数调用 API
AF.request(urlRequest)
.validate()
.responseDecodable(of: NestedTrackResponse.self) { response in
// It's always resulting in fatal error
guard let data = response.value else {
fatalError("Error receiving tracks from API.")
}
}
// - `AF` is Alamofire, but I've already tried not using it,
// and the error persists
// - `urlRequest` is just the URL of the API and the API key,
// doesn't really matter for this problem
并收到此错误
本应解码 Dictionary
,但找到了一个数组。
【问题讨论】: