如果我有这样的Json:
{ "i": [ "0", [123]] }
有没有办法解码上面的2D数组?
class ModelA: Codable{
var i: [String]?
var temp: [Any] = []
enum CodingKeys: String, CodingKey {
case i = "i"
}
required init(from decoder: Decoder) throws {
let value = try decoder.container(keyedBy: CodingKeys.self)
temp = try value.decode([Any].self, forKey: .i)
}
}
用法:
public func printJsonData(){
let jsonData: Data = """
{
"i": [ "0", [123]]
}
""".data(using: .utf8)!
if let model = try? JSONDecoder().decode(ModelA.self, from: jsonData){
print(model.temp)
}else{
print("no data")
}
}
我已经尝试过[Any]数组在这里成功运行, 但找不到任何在2D数组中进行转换的方法。 如果有人知道如何解决此问题,或者知道在Swift4.2中这是不可能的,请告诉我。谢谢!
答案 0 :(得分:3)
如果您知道数组值的可能数据类型,则可以尝试使用由枚举而不是app2.js
表示的可能值(在这种情况下为String
和[Int]
)。
例如:
Any
并在您的模型中声明它:
enum ArrayIntOrString: Decodable {
case string(String)
case arrayOfInt([Int])
init(from decoder: Decoder) throws {
if let string = try? decoder.singleValueContainer().decode(String.self) {
self = .string(string)
return
}
if let arrayOfInt = try? decoder.singleValueContainer().decode([Int].self) {
self = .arrayOfInt(arrayOfInt)
return
}
throw ArrayIntOrStringError.arrayIntOrStringNotFound
}
enum ArrayIntOrStringError: Error {
case arrayIntOrStringNotFound
}
}
用法
class ModelA: Decodable {
var i: [ArrayIntOrString]?
enum CodingKeys: String, CodingKey {
case i = "i"
}
}