Swift 4 Codable получить первый массив из массива - PullRequest
0 голосов
/ 26 января 2019

У меня есть JSON, который выглядит следующим образом:

{
  success: true,
  message: null,
  messages: null,
  data: [
    [ ... ]
  ]
}

Теперь мне интересно, я могу решить это с помощью:

struct Something: Codable {
    let data: [[Data]]
}

something.data.flatMap { $0 }

Но я бы предпочел сделать:

struct Something: Codable {
    let data: [Data]
}

Я уже знаю, что могу выполнить навигацию через JSON с наборами CodingKeys enums и container.nestedContainer(...), но как мне добиться этого, когда нет ключа, а есть только массив в массиве?Могу ли я добиться этого с помощью пользовательского init на Decodable и если да, то как?

1 Ответ

0 голосов
/ 26 января 2019

Возможное решение - написать собственный инициализатор для выравнивания массива

struct Root : Decodable {
    let success : Bool
    let data : [Foo]

    private enum CodingKeys : String, CodingKey { case success, data }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        success = try container.decode(Bool.self, forKey: .success)
        let arrayData = try container.decode([[Foo]].self, forKey: .data)
        guard !arrayData.isEmpty else {  throw DecodingError.dataCorruptedError(forKey: .data, in: container, debugDescription: "Object is empty")  }
        data = arrayData.first!
    }

}

struct Foo : Decodable { ... }

Тип Data существует в платформе Foundation. Вам настоятельно не рекомендуется использовать его в качестве пользовательского типа.

...