【问题标题】:How do I load a remote JSON file in Swift?如何在 Swift 中加载远程 JSON 文件?
【发布时间】:2022-01-16 02:35:39
【问题描述】:

我几乎是 Swift 的初学者。我已经玩过 SwiftUI 了,但仅此而已。不用说,我不知道类、结构、协议和其他一切在 Swift 中是如何工作的。

我目前正试图弄清楚如何将 JSON 文件加载到 Swift 中,但我一辈子都无法让它工作。我认为这样的东西对于这样一种现代语言来说是相当初级的,但显然不是。在尝试了多个教程和示例之后,我想出了这个凌乱的代码:

public class JSONReader {
    struct DatabaseObject: Decodable {
        let name: String
        let books: AnyObject
        let memoryVerses: AnyObject
    }
    private func parse(jsonData: Data) {
        do {
            let decodedData = try JSONDecoder().decode(DatabaseObject.self, from: jsonData)
            print(decodedData)
        } catch {
            print("decode error")
        }
    }
    private func loadJson(fromURLString urlString: String,
                          completion: @escaping (Result<Data, Error>) -> Void) {
        if let url = URL(string: urlString) {
            let urlSession = URLSession(configuration: .default).dataTask(with: url) { (data, response, error) in
                if let error = error {
                    completion(.failure(error))
                }
                
                if let data = data {
                    completion(.success(data))
                }
            }
            urlSession.resume()
        }
    }
    init() {
        loadJson(fromURLString: "Redacted for privacy") { result in
            switch result {
                case .success(let data):
                    self.parse(jsonData: data)
                case .failure(let error):
                    print(error)
            }
        }
    }
}

我不断收到构建时错误Type 'JSONReader.DatabaseObject' does not conform to protocol 'Decodable'

任何帮助、指示或提示将不胜感激!

【问题讨论】:

  • 如果您询问有关解析 JSON 的问题,最好包含一个包含您打算解析的 JSON 示例的块。这样我们就可以引导您找到适合您数据的数据结构。

标签: json swift


【解决方案1】:

AnyObject 类型不能被 swift 解码,您尝试解码的 books 属性和 memoryVerse 是不可解码的,如果您想解码它,您可以将它们的类型分别定义为像这样的可编码结构

struct Book : Codable{
    let property : String
    let otherProperty : String
}
struct Memory : Codable{
        let property : String
        let otherProperty : String
    }

struct DatabaseObject: Decodable {
        let name: String
        let books: Book
        let memoryVerses:Memory
    }

【讨论】:

  • 明白了!所以我基本上也需要对每个对象属性进行严格的处理。谢谢!我回家后会试试看,并确保将您标记为正确!
猜你喜欢
  • 2016-08-12
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多