如何将Json转换为2D数组?

时间:2018-09-28 08:44:46

标签: arrays json swift decode codable

如果我有这样的Json:

{ "i": [ "0", [123]] }

有没有办法解码上面的2D数组?

class ModelA: Codable{
    var i: [String]?
    var temp: [Any] = []

    enum CodingKeys: String, CodingKey {
        case i = "i"
    }

    required init(from decoder: Decoder) throws {
        let value = try decoder.container(keyedBy: CodingKeys.self)
        temp = try value.decode([Any].self, forKey: .i)
    }
}

用法:

public func printJsonData(){

    let jsonData: Data = """
    {
        "i": [ "0", [123]]
    }
    """.data(using: .utf8)!

    if let model = try? JSONDecoder().decode(ModelA.self, from: jsonData){
        print(model.temp)
    }else{
        print("no data")
    }
}

我已经尝试过[Any]数组在这里成功运行, 但找不到任何在2D数组中进行转换的方法。 如果有人知道如何解决此问题,或者知道在Swift4.2中这是不可能的,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:3)

如果您知道数组值的可能数据类型,则可以尝试使用由枚举而不是app2.js表示的可能值(在这种情况下为String[Int])。

例如:

Any

并在您的模型中声明它:

enum ArrayIntOrString: Decodable {

    case string(String)
    case arrayOfInt([Int])

    init(from decoder: Decoder) throws {

        if let string = try? decoder.singleValueContainer().decode(String.self) {
            self = .string(string)
            return
        }

        if let arrayOfInt = try? decoder.singleValueContainer().decode([Int].self) {
            self = .arrayOfInt(arrayOfInt)
            return
        }

        throw ArrayIntOrStringError.arrayIntOrStringNotFound
    }

    enum ArrayIntOrStringError: Error {
        case arrayIntOrStringNotFound
    }
}

用法

class ModelA: Decodable {

    var i: [ArrayIntOrString]?

    enum CodingKeys: String, CodingKey {
        case i = "i"
    }   
}