【问题标题】:Reading single string of json in swift ui在swift ui中读取单个json字符串
【发布时间】:2020-08-11 01:41:03
【问题描述】:

我正在使用这个 API http://shibe.online/api/shibes? 虽然当我加载它时,我看到的只是一个我想要使用的链接,但没有与之关联的变量标识符。

["https://cdn.shibe.online/shibes/be12be31e2c880b4ac6992b3bb02751211b6ee68.jpg"]
import Foundation
import SwiftUI
import Combine
import SDWebImageSwiftUI

struct ShibeView: View {
    @ObservedObject var fetcher = ShibeFetcher()

    var body: some View {
            AnimatedImage(url: URL(string: self.fetcher.shibe?.url ?? "")).resizable().scaledToFit()
    }
}

public class ShibeFetcher: ObservableObject {
    @Published var shibe: ShibeRecievers?

    init(){
        load()
    }

    func load() {
        let url = URL(string: "http://shibe.online/api/shibes?")!

        URLSession.shared.dataTask(with: url) {(data,response,error) in
            do {
                if let d = data {
                    let webData = try JSONDecoder().decode(ShibeRecievers.self, from: d)
                    DispatchQueue.main.async {
                        self.shibe = webData
                    }
                }else {
                    print("No Data")
                }
            } catch {
                print ("Error here")
            }

        }.resume()
    }
}


struct ShibeRecievers: Codable {
    var url: String //Not sure how to store the link from the api
}

我遇到的问题是将 api 的链接存储到我的应用程序中,我找不到任何没有变量名的 json 解析文档。

【问题讨论】:

    标签: json swift swiftui


    【解决方案1】:

    您的 json 响应只是一个字符串数组。所以你可以这样解码:

    try! JSONDecoder().decode([String].self, from: d)
    

    基于您当前实现的完整版本:

    struct ShibeView: View {
      @ObservedObject var fetcher = ShibeFetcher()
    
      var body: some View {
        Image(uiImage: UIImage(data: try! Data(contentsOf: URL(string: fetcher.shibe?.first ?? "https://i.imgur.com/epMSRQH.png")!)) ?? UIImage())
      }
    }
    
    public class ShibeFetcher: ObservableObject {
      @Published var shibe: [String]?
    
      init(){
        load()
      }
    
      func load() {
        let url = URL(string: "http://shibe.online/api/shibes?")!
    
        URLSession.shared.dataTask(with: url) {(data,response,error) in
          do {
            if let d = data {
              let webData = try JSONDecoder().decode([String].self, from: d)
              DispatchQueue.main.async {
                self.shibe = webData
              }
            }else {
              print("No Data")
            }
          } catch {
            print ("Error here")
          }
    
        }.resume()
      }
    }
    

    【讨论】:

    • 好的,我理解那部分,但现在我将用于显示图像的 url 存储在哪里。
    • 我认为您可以使用当前的方式来保存图像 url。你试过了吗?
    • @PeterK 查看我编辑的答案以获得完整版本。
    猜你喜欢
    • 1970-01-01
    • 2020-09-08
    • 2021-04-16
    • 2011-07-17
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2021-04-02
    相关资源
    最近更新 更多