Что не так с этим вызовом API, анализирующим данные JSON?

Это текущий код SWIFTUI, который у меня есть:

import SwiftUI

struct Holidays: Decodable {
    var date: String
    var localName: String
    var name: String
    var countryCode: String
}

struct HolidaysView: View {
    @State private var holidays = [Holidays]()
    
    var body: some View {
        NavigationView {
            List(holidays, id: \.name) { t in
                VStack(alignment: .leading) {
                    Text(t.date)
                        .font(.headline)
                        .foregroundColor(.cyan)
                    Text(t.name)
                        .font(.body)
                        .foregroundColor(.indigo)
                    Text(t.countryCode)
                        .font(.body)
                        .foregroundColor(.red)
                }
            }
            .navigationTitle("Holidays List")
            .task {
                await fetchHolidaysData()
            }
        }
    }
    
    func fetchHolidaysData() async {
        // create the URL
        guard let url = URL(string: "https://date.nager.at/api/v2/publicholidays/2020/US") else {
            print("THIS URL DOES NOT WORK!")
            return
        }
        
        // fetch the data
        do {
            let (data, _) = try await URLSession.shared.data(from: url)
            
            // decode that data
            if let decodedResponse = try? JSONDecoder().decode([Holidays].self, from: data) {
                holidays = decodedResponse
            }
        } catch {
            print("This data is not valid")
        }
    }
}

struct HolidaysView_Previews: PreviewProvider {
    static var previews: some View {
        HolidaysView()
    }
}

Цель этого кода — предоставить возможность просматривать данные json с помощью URL-адреса. Когда я нажимаю заголовок навигации «Список праздников», данные не отображаются (в представлении содержимого). Я пробовал другие ссылки API, такие как заполнители API для JSON, и они сработали. Я не могу понять проблему или разницу. Я тоже попробовал ИИ. Я не знаю, что делаю не так. Может ли быть так, что мне придется использовать все переменные данных API? Или, возможно, идентификатор? Другие API, которые я использовал, имели идентификаторы для каждого раздела данных, поэтому я добавил

List(holidays, id: \.name) { t in      ```
as 
List(todos, id: \.id) { t in      ```
```, could this be a possible reason?
                       

print("This data is not valid") называется? holidays = decodedResponse называется? Вам следует заменить if let decodedResponse = try? JSONDecoder() на let decodedResponse = try JSONDecoder()... и в подхвате print("This data is not valid") -> print("This data is not valid: \(error)"). В настоящее время, если есть ошибка в декодировании, вы просто заглушаете ее (с помощью try?, знак вопроса является глушителем), а с помощью отпечатка вы игнорируете обнаруженную ошибку, которая может сказать вам, почему это не удалось.

Larme 16.04.2024 00:46

ваш код с предложением @Larme try у меня хорошо работает. Обратите внимание, что для работы List необходимо убедиться, что элементы уникальны. Для этого я рекомендую создать праздники Identifiable, например struct Holidays: Identifiable, Decodable { let id = UUID()... Тогда вы можете использовать List(holidays) ...

workingdog support Ukraine 16.04.2024 01:26

@workingdogsupportUkraine и Ларме, спасибо вам обоим огромное, это мне очень помогло!

SomebodyNew 16.04.2024 06:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот мой рабочий пример кода, который объединяет рекомендации из комментариев. Код позволяет достичь цели, как описано The goal of this code is to be able to view the json data using the URL

struct Holidays: Identifiable, Decodable { // <-- here
    let id = UUID() // <-- here
    
    var date: String
    var localName: String
    var name: String
    var countryCode: String

    enum CodingKeys: String, CodingKey {
        case date, localName, name, countryCode  // <-- here no id
    }
}

// for testing
struct ContentView: View {
    var body: some View {
        HolidaysView()
    }
}

struct HolidaysView: View {
    @State private var holidays = [Holidays]()
    
    var body: some View {
        NavigationStack {  // <-- here
            List(holidays) { t in   // <-- here
                VStack(alignment: .leading) {
                    Text(t.date)
                        .font(.headline)
                        .foregroundColor(.cyan)
                    Text(t.name)
                        .font(.body)
                        .foregroundColor(.indigo)
                    Text(t.countryCode)
                        .font(.body)
                        .foregroundColor(.red)
                }
            }
            .navigationTitle("Holidays List")
            .task {
                await fetchHolidaysData()
            }
        }
    }
    
    func fetchHolidaysData() async {
        // create the URL
        guard let url = URL(string: "https://date.nager.at/api/v2/publicholidays/2020/US") else {
            print("THIS URL DOES NOT WORK!")
            return
        }
        // fetch the data
        do {
            let (data, _) = try await URLSession.shared.data(from: url)
            // decode that data
            holidays = try JSONDecoder().decode([Holidays].self, from: data) // <-- here
        } catch {
            print("error: \(error)") // <-- here, important
        }
    }
}

Другие вопросы по теме