【问题标题】:Fetching JSON data from an API in Swift从 Swift 中的 API 获取 JSON 数据
【发布时间】:2021-07-09 04:27:44
【问题描述】:

我最近开始学习在 Swift 中编写代码,并且一直在努力从 API 中获取数据。这是数据的样子:

{
   "status":200,
   "posts":[
      {
         "text":"djnkdnwnjdewkn",
         "date":"08/07/2012"
      },
      {
         "text":"dskndkc ksdskj n",
         "date":"08/17/2012"
      },
      {
         "text":"dkjdjincidjn",
         "date":"09/07/2012"
      }
   ]
}

这是我使用的代码:

import SwiftUI
import Foundation
import Combine

struct Post: Codable {
    public var text, date: String
}

struct Feed: Codable {
    public var status: Int
    public var posts: [Post]
}


class FetchPosts: ObservableObject {
    @Published var post = [Post]()

    init() {
        let url = URL(string: "api goes here")!
        URLSession.shared.dataTask(with: url) {(data, response, error) in
            do {
                if let postData = data {
                    let decodedData = try JSONDecoder().decode([Post].self, from: postData)
                    DispatchQueue.main.async {
                        self.post = decodedData
                    }
                } else {
                    print("No data")
                }
            } catch {
                print("Error")
            }
        }.resume()
    }
}

struct FeedView: View {
    @ObservedObject var fetch = FetchPosts()
    var body: some View {
        ScrollView{
            VStack {
                ForEach(fetch.posts) { post in
                    VStack(alignment: .leading) {
                        Text(post.text)
                        Text("\(post.date)")
                            .font(.system(size: 13))
                  
                    }
                }
            }
        }
    }
}

到目前为止,我还无法生成任何输出。我不确定问题出在我创建结构的方式上,还是我没有正确使用 JSONDecoder。任何指针将不胜感激!

【问题讨论】:

  • print("Error") => print("Error: \(error)") 这可能是您缺少的第一步。
  • question and answer。这非常详细地介绍了如何获取 JSON 并将其转换为您可以使用的数据。

标签: json swift api swiftui fetch


【解决方案1】:

您已正确创建了一个结构 Feed,但您没有使用它。调用 decode 而不是 [Post],

let decodedData = try JSONDecoder().decode(Feed.self, from: postData)

在处理错误时也永远不要打印硬编码字符串,因此请将 print("Error") 替换为 print(error)

你的代码就变成了

do {
    if let postData = data {
        let decodedData = try JSONDecoder().decode(Feed.self, from: postData)
        DispatchQueue.main.async {
            self.post = decodedData.posts
        }
    } else {
         print("No data")
    }
} catch {
    print(error)
}

【讨论】:

  • @Safade,对此有何反馈?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多