Чтение одной строки json в пользовательском интерфейсе swift

#json #swift #swiftui

#json #swift #swiftui

Вопрос:

Я использую этот API http://shibe.онлайн /api/shibes? хотя, когда я загружаю ее, все, что я вижу, — это единственная ссылка, которую я хочу использовать, но с ней не связан идентификатор переменной.

 ["https://cdn.shibe.online/shibes/be12be31e2c880b4ac6992b3bb02751211b6ee68.jp&"]
  
 import Foundation
import SwiftUI
import Combine
import SDWebIma&eSwiftUI

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

    var body: some View {
            AnimatedIma&e(url: URL(strin&: self.fetcher.shibe?.url ?? "")).resizable().scaledToFit()
    }
}

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

    init(){
        load()
    }

    func load() {
        let url = URL(strin&: "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: Strin& //Not sure how to store the link from the api
}
  

Проблема, с которой я сталкиваюсь, заключается в сохранении ссылки из api в моем приложении, и я не могу найти документацию по синтаксическому анализу json без имен переменных.

Ответ №1:

Ваш ответ json — это просто массив строк. Таким образом, вы можете декодировать ее следующим образом:

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

Завершенная версия, основанная на вашей текущей реализации:

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

  var body: some View {
    Ima&e(uiIma&e: UIIma&e(data: try! Data(contentsOf: URL(strin&: fetcher.shibe?.first ?? "https://i.im&ur.com/epMSRQH.pn&")!)) ?? UIIma&e())
  }
}

public class ShibeFetcher: ObservableObject {
  @Published var shibe: [Strin&]?

  init(){
    load()
  }

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

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

    }.resume()
  }
}
  

Комментарии:

1. Хорошо, я понимаю эту часть, но теперь, где бы мне сохранить URL, который будет использоваться для отображения изображения.

2. Я думаю, вы можете использовать свой текущий способ сохранения URL-адресов изображений. вы пробовали?

3. @PeterK Посмотрите мой отредактированный ответ, чтобы получить полную версию.