Как я могу конвертировать Json в 2D массив? - PullRequest
0 голосов
/ 28 сентября 2018

Если я получил 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")
    }
}

Я пытался, что массив [Любой] здесь успешно работает, но не могу найти какой-либо метод для преобразования в 2D массив.Если кто-то знает, как решить эту проблему, или знает, что это невозможно в Swift4.2, пожалуйста, сообщите мне.Спасибо!

1 Ответ

0 голосов
/ 28 сентября 2018

Если вам известны возможные типы данных для значения массива, возможно, вы можете попробовать использовать возможное значение (в данном случае String и [Int]), представленное enum, вместо 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"
    }   
}

использование

public func printJsonData() {

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

    do {
        let model = try JSONDecoder().decode(ModelA.self, from: jsonData)
        print(model.i)
    } catch let err {
        print("no data \(err)")
    }


}
...