我正在使用 TMDB api 并獲取電視節目季節,但我回傳的季節不在陣列內,而是作為具有名稱的物件:season/1, season/2. 我需要能夠決議任何季節的電視節目
有沒有辦法可以將其轉換為陣列,而無需擔心該節目有多少季?
struct Result: Codable {
var season1: Season?
var season2: Season?
var id: Int?
enum CodingKeys: String, CodingKey {
case season1
case season2
case id
}
}
struct Season: Codable {
var id: Int?
enum CodingKeys: String, CodingKey {
case id
}
}
{
"id" : 1234,
"season/1": {
"id": 1234
},
"season/2": {
"id": 12345
}
}
編輯:在動態編碼鍵中找到解決方案
private struct DynamicCodingKeys: CodingKey {
var stringValue: String
init?(stringValue: String) {
self.stringValue = stringValue
}
var intValue: Int?
init?(intValue: Int) {
return nil
}
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: DynamicCodingKeys.self)
var tempArray = [TestSeason]()
for key in container.allKeys {
if key.stringValue.contains("season/") {
let decodedObject = try container.decode(TestSeason.self, forKey: DynamicCodingKeys(stringValue: key.stringValue)!)
tempArray.append(decodedObject)
} else {
print("does not contain season \(key.stringValue)")
}
}
season = tempArray
}
uj5u.com熱心網友回復:
你得到了一個Dictionary,你可以直接訪問它而不使用你的Results結構。字典可能提供比陣列更靈活的資料訪問方式,但也可以輕松轉換為陣列。
由于您沒有說明您希望輸出的方式,下面將它們轉換為一個元組陣列,其中每個元組是 (season, id)
let data = json.data(using: .utf8)!
let decoder = JSONDecoder()
do {
let results = try decoder.decode([String:Season].self, from: data)
.map{($0.key, $0.value.id )}
print(results) // [("season/2", 12345), ("season/1", 1234)]
} catch {
print(error)
}
編輯:您也不需要CodingKeysinSeason因為它可以從屬性中推斷出來。所有你需要的是
struct Season: Codable {
let id: Int
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531426.html
標籤:json迅速
