在Swift UI中读取JSON的单个字符串

问题描述

我正在使用此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响应只是一个String数组。所以您可以像这样解码它:

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()
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...