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]?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理常见的JSON嵌套结构

如何使用 Codable 在 Swift 中使用动态文件名解析 JSON

Swift 3 / 如何处理嵌套的 NSDictionaries,因为“Any 类型的值没有成员值”

如何处理 JSON 响应

如何处理空的 JSON 对象?

如何处理更改密码中的异常?