Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 立即释放数据_Json_Swift_Swiftui - Fatal编程技术网

Json 立即释放数据

Json 立即释放数据,json,swift,swiftui,Json,Swift,Swiftui,我目前正在为我的应用程序开发一个标题UI元素,我的数据被立即释放时遇到了问题。我一直试图让控制台打印它正在接收的任何数据,但在控制台中我甚至没有看到。我试图实现的是,该应用程序连接到其目标“CDN”,然后获取标题数据。我正在使用PHP执行一个SQL查询,以生成一个数组,然后应用程序将从中获取数据。当运行所述纸条时,生成以下数组 {"id":"1","title":"Meet ergoWare","header_image":"https://gba.ergoware.io/cache/conte

我目前正在为我的应用程序开发一个标题UI元素,我的数据被立即释放时遇到了问题。我一直试图让控制台打印它正在接收的任何数据,但在控制台中我甚至没有看到。我试图实现的是,该应用程序连接到其目标“CDN”,然后获取标题数据。我正在使用PHP执行一个SQL查询,以生成一个数组,然后应用程序将从中获取数据。当运行所述纸条时,生成以下数组

{"id":"1","title":"Meet ergoWare","header_image":"https://gba.ergoware.io/cache/content/topstory/ergo_news_01.svg","summary":"GBA's New Ergonomic Portal!"}
惊人的阵列是的,所以下一部分是它将在应用程序中读取和编译,以创建标题卡,但问题是我无法加载数据。我知道我遗漏了一些东西,但是没有编译器为我指明我需要的方向,我就在摸索。这是Swift代码

import SwiftUI

struct Response: Codable {
    var results: [Article]
}

struct Article: Codable, Identifiable {
    var id: Int
    var title: String
    var header_image: String
    var summary: String
}

struct HeadlineUI: View {
    @State var results = [Article]()
    var CDNLink: String

    var body: some View {
        ScrollView(.horizontal) {

            HStack(spacing: 20) {
                ForEach(results) { result in
                    CardView(image: result.header_image, summary: result.summary, heading: result.title)
                }
                .onAppear(perform: { self.loadData() })
            }
        }
    }

    func loadData() {
        guard let url = URL(string: CDNLink) else {
            print("Invalid URL")
            return
        }
        let request = URLRequest(url: url)

         URLSession.shared.dataTask(with: request) { data, response, error in
            if let data = data {
                if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
                    DispatchQueue.main.async {
                        self.results = decodedResponse.results
                        print(self.results)
                    }
                    return
                }
            }
            print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
        }.resume()
    }
}

struct HeadlineUI_Previews: PreviewProvider {
    static var previews: some View {
        HeadlineUI(CDNLink: "https://gba.ergoware.io/cdn?funct=fetchNews")
    }
}

因此,它应该连接到“CDN”并读取阵列。然后插入这些信息,对于由id定义的结果的每个索引,应该显示一张卡片,上面有头条新闻图像、文章标题和简短摘要。我开始对斯威夫特感到更舒服了,但是像这样的小打嗝会让我的信心崩溃,哈哈。感谢您提供的任何可教的时刻。

我找到了它,请按照以下步骤操作:

  • 根据您的类响应,您的服务应返回以下JSON:

    {
    "results" : [{
       "id":1,
       "title":"Meet ergoWare",
       "header_image":"https://gba.ergoware.io/cache/content/topstory/ergo_news_01.svg",
       "summary":"GBA's New Ergonomic Portal!"
    }]
    }
    
    用这个试试看

  • 你应该把.onAppear放在你的HStack中,而不是放在你的ForEach中。下面是一个完整的示例:

    struct Response: Codable {
        var results: [Article]
    }
    
    struct Article: Codable, Identifiable {
        var id: Int
        var title: String
        var header_image: String
        var summary: String
    }
    
    struct HeadlineUI: View {
    @State var results = [Article]()
    var CDNLink: String
    
    var body: some View {
        ScrollView(.horizontal) {
            HStack(spacing: 20) {
                Text("Response:")
                ForEach(results) { result in
                    Text(result.title)
                }
    
            }.onAppear(perform: { self.loadData() })
        }
    }
    
    func loadData() {
        guard let url = URL(string: CDNLink) else {
            print("Invalid URL")
            return
        }
        let request = URLRequest(url: url)
    
        URLSession.shared.dataTask(with: request) { data, response, error in
            if error != nil {
                print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
                return
            } else {
                do {
                    let decodedResponse = try JSONDecoder().decode(Response.self, from: data!)
                    print(decodedResponse)
                    self.results = decodedResponse.results
                } catch let err {
                    print("Error parsing: \(err)")
    
                }
            }
        }.resume()
    }
    }
    

  • 改变
    试试?JSONDecoder()
    试试!JSONDecoder()
    您将看到错误,您发布的JSON是一个对象,而不是一个数组,您的Swift代码期望的是一个具有属性
    results
    @zaitsman条件绑定初始值设定项必须具有可选类型,而不是我得到的错误“Response”。是的,这是一个明显的错误,如果要切换到
    try,则还必须删除
    if let={}
    ,只需删除if语句后的
    if
    {}
    。更改代码如下:```if let data=data{let decodedResponse=try!JSONDecoder().decode(Response.self,from:data)DispatchQueue.main.async{self.results=decodedResponse.results print(self.results)}``所以我试着编译了这个,但我仍然没有在UI或控制台中得到任何填充结果。你能在日志中看到错误吗?你的服务返回了正确的JSON吗?试着使用这个url:我不能,这是我的问题,我的控制台日志中没有任何错误。这段代码对我来说非常有效,请尝试重新启动连接重新启动控制台并确保服务返回代码所期望的JSON的设备,否则JSONDecoder()将失败,并报告