如何在SwiftUI中使用combake从URL中解析单个JSON对象?

问题描述 投票:0回答:1

目前,我正在尝试解析单个对象,并将其解码,准备在我的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
}

我创建了以下的fetcher:

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

我从URL中读到的JSON是: https:/beta.ourmanna.comapiv1get?format=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 rx-swift combine
1个回答
0
投票

你的问题中提到的代码不能编译.为了使你的代码能够正常工作,我对你的代码进行了修改,也添加了一些注释。

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
}
© www.soinside.com 2019 - 2024. All rights reserved.