gpt4 book ai didi

ios - Swift 4.1 Decodable无法使用nestedContainer解码嵌套数组

转载 作者:行者123 更新时间:2023-12-01 17:46:52 26 4
gpt4 key购买 nike

尝试使用Codable解析Swift 4.1编写一个简单的json

我有一个这样的struct:

struct GameCharacter : Codable {
var name : String
var weapons : [Weapon]
enum CodingKeys : String, CodingKey {
case name
case weapons
}

init(from decoder: Decoder) {
do {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decode(String.self, forKey: .name)
let weaponsContainer = try container.nestedContainer(keyedBy: Weapon.CodingKeys.self, forKey: .weapons)
self.weapons = try weaponsContainer.decode([Weapon].self, forKey: .weapons)

} catch let error {
print("error: \(error)")
fatalError("error is \(error)")
}
}
}

和另一个类似的文件:
struct Weapon : Codable {    
var name : String
enum CodingKeys : String, CodingKey {
case name
}

init(from decoder: Decoder) {
do {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.name = try container.decode(String.self, forKey: .name)
} catch let error {
print("error: \(error)")
fatalError("error is \(error)")
}
}
}

我也有包装的struct,像这样:
struct Game : Codable {
var characters : [GameCharacter]
enum CodingKeys : String, CodingKey { case characters }
}

json数据如下:
{ 
"characters" : [{
"name" : "Steve",
"weapons" : [{
"name" : "toothpick"
}]
}]
}

但是,我总是收到typeMismatcherror错误:

错误:typeMismatch(Swift.Dictionary,
Swift.DecodingError.Context(codingPath:[CodingKeys(stringValue:
“characters”,intValue:nil),_JSONKey(stringValue:“Index 0”,
intValue:0)],debugDescription:“预期解码
字典,但找到一个数组。”,底层错误:
零))

在这条线上:
let weaponsContainer = try container.nestedContainer(keyedBy: Weapon.CodingKeys.self, forKey: .weapons)

我不确定是什么问题,因为(在我看来)我很清楚地要求一系列武器,但它仍然认为我正在寻找字典。

想知道是否有人对我缺少的东西有任何见识。

最佳答案

仅当您要将子字典或子数组解码为父结构时才需要nestedContainers,例如,将weapons对象解码为Game结构-情况并非如此,因为您声明了所有嵌套结构。

要解码JSON,您可以省略所有CodingKeys和初始化程序,利用Codable的魔力,这就足够了:

struct Game : Codable {
let characters : [GameCharacter]
}

struct GameCharacter : Codable {
let name : String
let weapons : [Weapon]
}

struct Weapon : Codable {
let name : String
}

叫它
do {
let result = try JSONDecoder().decode(Game.self, from: data)
print(result)
} catch { print(error) }

关于ios - Swift 4.1 Decodable无法使用nestedContainer解码嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49973573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com