【问题标题】:JSON Codable - What to do with [Any]?JSON Codable - 如何处理 [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] 类型

标签: ios json swift codable any


【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 2020-03-10
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多