JSON Codable - 如何处理 [Any]?
Posted
技术标签:
【中文标题】JSON Codable - 如何处理 [Any]?【英文标题】:JSON Codable - What to do with [Any]? 【发布时间】:2020-03-25 17:26:06 【问题描述】:我有一个具有以下结构的 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 可以使用的东西......
有人可以分享解决方案的提示吗?
非常感谢:)
【问题讨论】:
你有没有在这里尝试过 [String,Int] 类型 【参考方案1】:在自定义init(from:)
中解码时,您需要为此使用未加密的容器。
如果你知道一个字符串后跟一个整数,你可以为这样的值定义结构
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
【讨论】:
以上是关于JSON Codable - 如何处理 [Any]?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Codable 在 Swift 中使用动态文件名解析 JSON