如何在 Swift 中加载远程 JSON 文件?

Posted

技术标签:

【中文标题】如何在 Swift 中加载远程 JSON 文件?【英文标题】:How do I load a remote JSON file in Swift? 【发布时间】: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 示例的块。这样我们就可以引导您找到适合您数据的数据结构。 【参考方案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
    

【讨论】:

明白了!所以我基本上也需要对每个对象属性进行严格的处理。谢谢!我回家后会试试看,并确保将您标记为正确!

以上是关于如何在 Swift 中加载远程 JSON 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中加载带有 HTML 的 CSS 文件?

如何在 Javascript 中加载本地 JSON 文件

如何在 Xcode 中加载本地 json 文件以进行单元测试?

Facebook 如何发布 json 并在 iframe 中加载响应?

在 Angular 2 中加载配置 JSON 文件

如何在 C# Unity 中加载带有扩展名(.json)的资产文件夹中的任何文件