动态解码SwiftUI中的对象



解码JSON的正确方法是什么,可以返回一个值作为字符串或字符串数组的一个键?

struct HTTPError : Codable {
var statusCode: Int?
var message: [String]
var error: String?
}

我有上面我使用的结构体,如果返回的JSON在消息属性中包含字符串数组,它就可以工作,但如果它只有一个项目,服务器将该属性作为字符串返回。

我得到的错误是泛型类型不匹配
expression unexpectedly raised an error: Swift.DecodingError.typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "message", intValue: nil)], debugDescription: "Expected to decode Array<Any> but found a string/data instead."

我不确定如何根据我从服务器得到的响应手动解码对象。

谢谢!

您可以创建自定义的init(from decoder: Decoder) throws

struct HTTPError : Codable {
var statusCode: Int?
var message: [String]
var error: String?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.statusCode = try container.decodeIfPresent(Int.self, forKey: .statusCode)
do{
//Try the array
self.message = try container.decode([String].self, forKey: .message)
}catch{
//Try the String if neither work throw an error
self.message = [try container.decode(String.self, forKey: .message)]
}
self.error = try container.decodeIfPresent(String.self, forKey: .error)
}
}

最新更新