gpt4 book ai didi

ios - 如果 json 有效负载中有一个标签类型不匹配,为什么 swift4 中的 Decode 方法会给出对象 nil

转载 作者:搜寻专家 更新时间:2023-11-01 07:07:59 24 4
gpt4 key购买 nike

我有如下的 json 负载

{
"name": "Dog",
"type": 1
}

我想从 json 转换为自定义类型的类如下

class Animal: Codable {
var name: String?
var type: String?
}

解码过程:

let decoder = JSONDecoder()
var animal: Animal?

do {
animal = try decoder.decode(Animal.self, from: data)
} catch DecodingError.keyNotFound(let key, let context) {

} catch DecodingError.valueNotFound(let type, let context) {

} catch DecodingError.typeMismatch(let type, let context) {
print("mismatch")
}
catch {
print("some error \(error.localizedDescription)")
}

print(animal?.name ?? "Decode did not happen!")

动物对象为零。然而,根据苹果 WWDC 谈话(https://developer.apple.com/videos/play/wwdc2017/212/),它应该将类型属性的值赋给 nil。由于“类型”数据不匹配。 (应为 String 但已找到 Int)

你能猜出这背后的原因是什么吗?如果任何一种标签数据类型不匹配,那么整个对象都变成 nil 对我来说听起来不太好。

最佳答案

请仔细阅读报错信息,原因很明确(无需猜测)

Expected String but Int has been found

表示(找到的)值为 Int 但您声明了一个 String 属性

JSON中的所有字符串都用双引号括起来,type的类型是Int

class Animal: Codable {
var name: String?
var type: Int?
}

如果 JSON 始终包含两个值,则通过删除问号将属性声明为非可选。

如果发生任何错误,隐式解码器/初始化器就会失败,您可以从代码语法中看出这一点。如果您想更好地控制,请编写您自己的自定义初始化程序。

关于ios - 如果 json 有效负载中有一个标签类型不匹配,为什么 swift4 中的 Decode 方法会给出对象 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46936513/

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