如何在 swiftUI 中显示 JSON 数据
How do you display JSON Data in swiftUI
我在 SwiftUI 中显示 JSON 数据时遇到问题,我从 Genius 获取数据 API 我目前正在搜索歌曲,可以确认我已正确提取数据;例如我可以打印出结果的标题:
这是我获取数据的方式
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()
}
}
因此,当我获取数据时,我将其保存到变量 fetchedSongsResults 中,这似乎是正确的,但是出于某种原因,当我尝试打印计数时,例如它说我是空的,而且我无法循环遍历 fetchedSongsResults使用列表或 ForEach 就是这样,(我相信这是因为我没有使模型可识别)我试图打印 fetchedSongsResults 的计数,
这是在 body 之外初始化的(如你所知)
@State var networkManager = NetworkManager()
这是在body
里面
Text("\(networkManager.fetchedSongsResults.count)")
如果你想知道当我解码 JSON 数据时我的结构是什么样子的,那就是
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
}
尝试:@ObservedObject var networkManager = NetworkManager()。
我在 SwiftUI 中显示 JSON 数据时遇到问题,我从 Genius 获取数据 API 我目前正在搜索歌曲,可以确认我已正确提取数据;例如我可以打印出结果的标题:
这是我获取数据的方式
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()
}
}
因此,当我获取数据时,我将其保存到变量 fetchedSongsResults 中,这似乎是正确的,但是出于某种原因,当我尝试打印计数时,例如它说我是空的,而且我无法循环遍历 fetchedSongsResults使用列表或 ForEach 就是这样,(我相信这是因为我没有使模型可识别)我试图打印 fetchedSongsResults 的计数,
这是在 body 之外初始化的(如你所知)
@State var networkManager = NetworkManager()
这是在body
里面Text("\(networkManager.fetchedSongsResults.count)")
如果你想知道当我解码 JSON 数据时我的结构是什么样子的,那就是
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
}
尝试:@ObservedObject var networkManager = NetworkManager()。