[英]Array in JSON not parsing with custom decoding function in Swift
[英]Swift custom decoding - joining properties
我正在嘗試使用下面的以下對象解碼像MyPets
這樣的對象。 我嘗試使用 4 CodingKeys cat、dog、catName 和 dogName,但由於這些名稱不在 MyPets 結構中,因此它們不可用於解碼,然后與其他名稱一起填充Dog
和Cat
結構。 我還嘗試了 nestedContainer 作為名稱屬性,但沒有成功。 有任何想法嗎? 謝謝!
struct MyPets: Decodable {
let dog: Dog
let cat: Cat
// enum CodingKeys: String, CodingKey {
// case dog
// case cat
// case catName
// case dogName
// }
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
// values only has dog and cat
}
}
struct Dog {
let name: String
let weight: Int
let food: String
}
struct Cat {
let name: String
let weight: Int
let food: String
}
具有以下對象:
{
"catName": "fluffy",
"dogName": "softy",
"cat": {
"food": "fancyFeast",
"weight": "8"
},
"dog": {
"food": "kibble",
"weight": "9"
}
}
我想做這樣的事情來重新創建 Cat 結構
let catName = (try values.decode(String.self, forKey: .catName))
self.cat = Cat(name: catName, etc...)
這可以通過使用兩個不同的CodingKey
枚舉來使用,一個用於實際屬性,另一個用於我們解碼為局部變量。
struct MyPets: Decodable {
var dog: Dog
var cat: Cat
enum CodingKeys: String, CodingKey {
case dog
case cat
}
enum HiddenKeys: String, CodingKey {
case dogName
case catName
}
然后我們通過創建兩個不同的容器在init(from:)
中使用它們
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
dog = try container.decode(Dog.self, forKey: .dog)
cat = try container.decode(Cat.self, forKey: .cat)
let otherContainer = try decoder.container(keyedBy: HiddenKeys.self)
let dogName = try otherContainer.decode(String.self, forKey: .dogName)
let catName = try otherContainer.decode(String.self, forKey: .catName)
self.dog.name = dogName
self.cat.name = catName
}
Dog
和Cat
(此處未顯示)也需要符合Decodable
並使用它們自己的CodingKey
枚舉
struct Dog: Decodable {
var name: String = ""
let weight: Int
let food: String
enum CodingKeys: String, CodingKey {
case weight, food
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.