【问题标题】:How do you display JSON Data in swiftUI如何在 swiftUI 中显示 JSON 数据
【发布时间】:2019-11-15 18:44:17
【问题描述】:

我在 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 循环list 或 ForEach 就是这样,(我相信是因为我没有使模型可识别)我试图打印 fetchedSongsResults 的计数,

这在体外初始化(只是为了让你知道)

@State var networkManager = NetworkManager()

这是在体内

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
}

【问题讨论】:

  • @State for NetworkManager 看起来不对,因为这意味着 networkManager 以某种方式与我认为不是的用户界面组件相关联。
  • 如果您的 Authorization 标头中的值是私有的,您可能希望将其从您的问题中删除。
  • 是的,你是对的,@ObservedObject 解决了这个问题,但我想问你知道为什么我不能在列表中使用得到以下错误“无法转换类型的值 () - > ()' 到预期的参数类型 '() -> _'"

标签: json swift swiftui urlsession


【解决方案1】:

尝试:@ObservedObject var networkManager = NetworkManager()。

【讨论】:

  • 是的,它确实有效,但是我有另一个问题是我不能将它与列表一起使用我收到以下错误“无法将类型'() -> ()' 的值转换为预期参数类型 '() -> _'"
  • 你的struct值是空的,试试放一些预设值看看这个问题是否还存在
  • 我试过你的解决方案,但没有用,但还是谢谢
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2020-11-29
相关资源
最近更新 更多