Проблема с кодом, который у вас есть, состоит в том, что вы пытаетесь преобразовать массив в словарь (как правильно отметили несколько человек в комментариях Vadian, Moritz на момент написания статьи).
Таким образом, очевидным решением первого шага было бы вместо приведения к [String: Any]
приведение к [[String: Any]]
(массив словарей), но это все равно оставляет проблему с частью Any
.Чтобы работать с этим словарем, вам нужно знать / запоминать ключи и их типы, а также приводить каждое значение по мере его использования.
Гораздо лучше использовать протокол Codable
, который вместе с декодером позволяет вам в основном отображать JSON в соответствующие структуры кода.
Вот пример того, как вы можете проанализировать этот JSON, используя кодируемый протокол Swift 4 (сделано на Swift Playground)
let jsonData = """
[{
"idcatalog": 1,
"imgbase64": "",
"urlImg": "http://172.../page01.jpg",
"urlPages": "http://172.../catalog_1_pages.json",
"dt_from": "",
"dt_to": ""
}, {
"idcatalog": 2,
"imgbase64": "",
"urlImg": "http://172.../1.jpg",
"urlPages": "http://172.../2_pages.json",
"category": [{
"id": 1,
"lib": "lib"
}],
"dt_to": ""
}]
""".data(using: .utf8)!
struct CatalogItem: Codable {
let idCatalog: Int
let imgBase64: String?
let urlImg: URL
let urlPages: URL
let dtFrom: String?
let dtTo: String?
let category: [Category]?
enum CodingKeys: String, CodingKey {
case idCatalog = "idcatalog"
case imgBase64 = "imgbase64"
case urlImg, urlPages, category
case dtFrom = "dt_from"
case dtTo = "dt_to"
}
}
struct Category: Codable {
let id: Int
let lib: String?
enum CodingKeys: String, CodingKey {
case id, lib
}
}
do {
let decoder = JSONDecoder()
let result = try decoder.decode([CatalogItem].self, from: jsonData)
print(result)
} catch {
print(error)
}
Вывод на консоль:
[__lldb_expr_118.CatalogItem (idCatalog: 1, imgBase64: необязательный (""), urlImg: http://172. .. / page01.jpg , urlPages: http://172.../catalog_1_pages.json, dtFrom: необязательный (""), dtTo: необязательный (""), категория: nil), __lldb_expr_118.CatalogItem (idCatalog: 2, imgBase64: необязательный (""), urlImg: http://172. .. / 1.jpg , urlPages: http://172. .. / 2_pages.json , dtFrom: nil, dtTo: Optional (""), категория: необязательная ([__lldb_expr_118.Category (id: 1, lib: Необязательно ("lib"))]))]
Теперь самое интересное, теперь эти данные гораздо проще использовать ...
print(result.first?.urlImg)
Выход:
Дополнительно (http://172. .. / page01.jpg )
Это работает для примера JSON, который вы предоставили, но может потребоваться больше настроек, основанных на остальной части вашего набора данных.