我有一个JSON,其结构如下:
"properties":[
{
"name":"Quality",
"values":[],
"displayMode":0,
"type":6
},
{
"name":"Armour",
"values":[],
"displayMode":0,
"type":16
},
{
"name":"Evasion Rating",
"values":[],
"displayMode":0,
"type":17
}
]
API总是返回"value"
的数组,其中第一个元素是String
,第二个元素是Int
。
"values":[
[
"+26%",
1
]
],
到目前为止,我是如何映射JSON的:
struct Properties: Codable {
var name: String
var values: [Any]
var displayMode: Int
var type: Int
}
此时Xcode由于Type 'Properties' does not conform to protocol 'Decodable'
而抱怨
所以,我知道Any
不符合codable
,但问题是我不知道如何将这个[Any]
转换为Swift可以使用的东西。。。
有人能分享解决方案的提示吗?
非常感谢:(
在自定义init(from:)
中解码时,需要使用一个unkeyed容器。
如果你知道总是有一个字符串后面跟着一个整数,你可以定义像这样的值的结构
struct Value: Decodable {
let string: String?
let integer: Int?
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
string = try container.decodeIfPresent(String.self)
integer = try container.decodeIfPresent(Int.self)
}
}
如果可以有更多的元素,你可以使用循环代替
struct Value: Decodable {
let strings: [String]
let integers: [Int]
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
var strings = [String]()
var integers = [Int]()
while !container.isAtEnd {
do {
let string = try container.decode(String.self)
strings.append(string)
} catch {
let integer = try container.decode(Int.self)
integers.append(integer)
}
}
self.integers = integers
self.strings = strings
}
}