JSON可编码-如何处理[Any]



我有一个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
}
}

相关内容

  • 没有找到相关文章

最新更新