YeahGarage
@YeahGarage
Developer

Парсинг Json, с вложенной ссылкой еще на один Json?

Приветстую

Подскажите как распарсить json, в котором ссылка еще на один json, в одном запросе. Посколку я заполняю из этого Json CollectionView, и если делать второй запрос, то надо делать костыли с корректным отображением картинок к ячейкам. Ситуация следующая

1. У меня структура файла
struct Headline: Codable {
    var articles: [Article]
}


struct Article: Codable {
    let id: Int?
    let date, dateGmt: String?
    let links: Links?

    enum CodingKeys: String, CodingKey {
        case id, date
        case dateGmt = "date_gmt"
        case links = "_links"
    }
}

struct Links: Codable {
    let linksSelf, collection, about: [About]? // []
    let wpFeaturedmedia: [Author]?

    enum CodingKeys: String, CodingKey {
        case linksSelf = "self"
        case collection, about, author, replies
        case wpFeaturedmedia = "wp:featuredmedia"
    }
}

struct Author: Codable {
    let embeddable: Bool?
    let href: String?

    enum CodingKeys: String, CodingKey {
        case href
        case embeddable
    }
}


В структуре Author находится href, в котором ссылка еще на один JSON, с которого мне надо достать ссылку

Получаю я все это стандартно

static func getArticles(url: URL?, completion: @escaping ([Article]?) -> Void) {
        url?.get(completion: { (result: Result<[Article], ApiError>) in
            switch result {
            case .success(let headline):
                print("\n News Api extension getArticles headline \(String(describing: headline.count))")
                completion(headline)
            case .failure(_):
                print("\n News Api getArticles failure")
                completion(nil)
            }
        })
    }
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 1
Было бы здорово ещё пример JSON увидеть.
Но вообще, костылём будет как раз пытаться обойти вызов второго запроса. Почитайте про Combine и сделайте как-то так:
Перед запросом выставляете на UI лоадер, вызываете первый запрос, если в нём получили в JSON ещё один url, то синхронно с первым выполняете второй запрос и уже итоговый набор данных возвращаете в completion вместе с выключением лоадера и перетасовкой UI. Если url не получен, то после первого запроса вызываете completion со всеми приседаниями по UI и с учётом отсутствия ссылки.

Но вообще, лучше бы сначала лоадер на весь интерфейс, после получения первого JSON лоадер снимаете и делаете второй запрос по ссылке из первого с лоадером на тот элемент, который должен загрузиться из урла в json
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы