【发布时间】:2021-11-14 05:14:36
【问题描述】:
我需要解码一个 JSON:
override func viewDidLoad() {
super.viewDidLoad()
foo()
}
struct MOCK: Codable {
var array = [AnyClass]()
enum CodingKeys: String, CodingKey {
case array = "arr"
}
}
func foo() {
let MOCK_JSON = """
{
"arr" : [
0,"my_str1",
90,"my_str2"
]
}
"""
do {
let data: Data = MOCK_JSON.data(using: .utf8)!
let manifest = try JSONDecoder.init().decode(MOCK.self, from: data)
print("\(manifest)")
} catch let error {
print("ERROR:", error)
}
}
这里我使用了一个模拟 JSON,但我使用的真实结构看起来是一样的
我得到的错误是
类型“ViewController.MOCK”不符合协议“Decodable”
如何正确解码 JSON?
UPD
根据@vadian 评论,我尝试像这样使用unKeyedContainer
struct MOCK: Decodable {
let array: [Any]
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
array = try container.decode([Any].self)
}
}
但我仍然在最后一行出现错误
对实例方法“解码”的调用没有完全匹配
【问题讨论】:
-
@Cy-4AH 这不是很明显你的意思是什么?在您的示例中,您在我的示例中解码了一个字符串数组(实际上这是一个问题)我正在尝试解码一个不同类型的数组...
-
Any在Codable、AnyObject和AnyClass中均不受支持。您的数组是规则的,并且交替使用Int和String,因此请使用unKeyedContainer和循环。 -
你可以寻找“Any Codable”、“AnyCodable”或“Generic”+ Swift,应该有一些想法......
-
@vadian 为我的问题添加了更新