【问题标题】:How to parse single JSON object from URL in SwiftUI using combine?如何使用组合从 SwiftUI 中的 URL 解析单个 JSON 对象?
【发布时间】:2020-09-01 10:00:40
【问题描述】:

目前,我正在尝试解析单个对象并将其解码,以便在我的 SwiftUI 视图中输出到 Text(),但我无法创建没有参数的实例。

我找到了很多动态创建列表的资源,但这只是一个独立的对象。 很多资源都展示了如何使用数组创建 @Published 变量,但我只想要一个对象。

我构建的解码结构是:

// MARK: - Welcome
struct Welcome: Codable {
    let verse: Verse
}

// MARK: - Verse
struct Verse: Codable {
    let details: Details
    let notice: String
}

// MARK: - Details
struct Details: Codable {
    let text, reference, version: String
    let verseurl: String
}

我创建了以下提取器:

public class VerseFetcher: ObservableObject {
    @Published var verse = Welcome()

    init(){
        load()
    }

    func load() {
        let url = URL(string: "https://beta.ourmanna.com/api/v1/get/?format=json")!

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

        }.resume()
    }
}

我已经尝试过这个解决方案来获得输出:

struct DailyVerseView: View {
    @ObservedObject var fetcher = VerseFetcher()

    var body: some View {

        Text(self.fetchVerse.todos.verse.details.text)
            .fontWeight(.semibold)
            .font(.caption)
            .foregroundColor(.secondary)
            .padding(.leading, 16)
            .padding(.trailing, 16)
            .padding(.top, 8)
            .padding(.bottom, 8)
    }
}

我从https://beta.ourmanna.com/api/v1/get/?format=json 的 URL 读取的 JSON 是:

{
  "verse": {
    "details": {
      "text": "The world and its desires pass away, but the man who does the will of God lives forever.",
      "reference": "1 John 2:17",
      "version": "NIV",
      "verseurl": "http://www.ourmanna.com/"
    },
    "notice": "Powered by OurManna.com"
  }
}

如何创建不带参数的 Verse 结构,因为它是来自 URL 响应的动态?

【问题讨论】:

    标签: json swift swiftui combine


    【解决方案1】:

    您的问题中提到的代码无法编译。 为了使您的代码正常工作,我对您的代码进行了更改并添加了一些 cmets。

    struct DailyVerseView: View {
        @ObservedObject var fetcher = VerseFetcher()
    var body: some View {
    
        Text(self.fetcher.verse?.verse.details.text ?? "") // Changed fetchVerse to fetcher
            .fontWeight(.semibold)
            .font(.caption)
            .foregroundColor(.secondary)
            .padding(.leading, 16)
            .padding(.trailing, 16)
            .padding(.top, 8)
            .padding(.bottom, 8)
    }}
    
    public class VerseFetcher: ObservableObject {
    @Published var verse: Welcome?
    
    init(){
        load()
    }
    
    func load() {
        let url = URL(string: "https://beta.ourmanna.com/api/v1/get/?format=json")!
    
        URLSession.shared.dataTask(with: url) {(data,response,error) in
            do {
                if let d = data {
                    //Decoding Welcome instead of Verse directly
                    let webData = try JSONDecoder().decode(Welcome.self, from: d)
                    DispatchQueue.main.async {
                        self.verse = webData
                    }
                }else {
                    print("No Data")
                }
            } catch {
                print ("Error here")
            }
    
        }.resume()
    }}
    
    
    // MARK: - Welcome
    struct Welcome: Codable {
        let verse: Verse
    }
    
    // MARK: - Verse
    struct Verse: Codable {
        let details: Details
        let notice: String
    }
    
    // MARK: - Details
    struct Details: Codable {
        let text, reference, version: String
        let verseurl: String
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多