简体   繁体   中英

How do you display JSON Data in swiftUI

I have problem with showing JSON Data in SwiftUI, I get the data from Genius API I currently search for song and can confirm that I get the data extracted correctly; example I can print out the title of the result:

在此处输入图像描述

This is how I fetch the data

class NetworkManager: ObservableObject {
    var objectWillChange = PassthroughSubject<NetworkManager, Never>()

    var fetchedSongsResults = [hits]() {
        willSet {
            objectWillChange.send(self)
        }
    }

    init() {
        fetchSongs()
    }

    func fetchSongs() {
        guard let url = URL(string: "https://api.genius.com/search?q=Sia") else { return }
        var urlRequest = URLRequest(url: url)
        urlRequest.setValue("Bearer TOKEN", forHTTPHeaderField: "Authorization")

      URLSession.shared.dataTask(with: urlRequest) {data, response, error in
            guard let data = data else { return }
            //print(String(decoding: data, as: UTF8.self))
            let songs = try! JSONDecoder().decode(feed.self, from: data)
            DispatchQueue.main.async {
                self.fetchedSongsResults = songs.response.hits

            }
        }.resume()
    }
}

So when I get the data I save to the variable fetchedSongsResults and this seems correctly but for what ever reason when I try to print the count for example it says that i empty and also I can't loop through the fetchedSongsResults using a list or ForEach this is how, (which I believe s because I have not made the model identifiable) I tried to print the count of fetchedSongsResults,

This initialized outside the body (just so you know)

@State var networkManager = NetworkManager()

This is inside the body

Text("\(networkManager.fetchedSongsResults.count)")

If your are wondering how my structure looks like when I decode the JSON Data then here it is

struct feed: Codable {
   var meta: meta
   var response: response
}

struct meta: Codable {
   var status: Int
}

struct response: Codable {
   var hits: [hits]
}

struct hits: Codable {
   var index: String
   var type: String
   var result: song
}

struct song: Codable, Identifiable {
   var id: Int
   var header_image_thumbnail_url: String
   var url: String
   var title: String
   var lyrics_state: String
   var primary_artist: artist

}

struct artist: Codable {
   var name: String
}

Try: @ObservedObject var networkManager = NetworkManager().

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM