首页 > 解决方案 > 如何使用 SwiftUI 解析 json 的对象数组

问题描述

在这里对 Swift 来说是全新的,所以我什至不知道如何使用打印调试,所以我想我会在这里问。

我正在尝试解析一系列对象,每个对象都采用以下格式:

{
      "id": 0,
      "title": "Example Title",
      "targets": [
         {
            "name": "Example Name"
         },
         {
            "name": "Example Name"
         },
         {
            "name": "Example Name"
         },
         {
            "name": "Example Name"
         }
      ],
      "benefits": [
         {
            "name": "Example Benefit"
         },
         {
            "name": "Example Benefit"
         },
         {
            "name": "Example Benefit"
         }
      ],
      "steps": [
         {
            "name": "Example Step"
         },
         {
            "name": "Example Step"
         }
      ],
      "videoURL": "https://someurl.com"
   },

所以我有一个这样定义的结构

struct Obj: Codable, Hashable {
    var id:Int
    var title:String
    var targets:[String]
    var benefits:[String]
    var steps:[String]
    var videoURL:String
}

并使用

let objs:[Obj] = decode([Obj].self, from: "./Data/Objs.json")

这个函数在哪里解码

func decode<T: Decodable>(_ type:T.Type, from filename:String) -> T {
    guard let json = Bundle.main.url(forResource: filename, withExtension: nil) else {
        fatalError("Failed to locate \(filename) in app bundle.")
    }
    
    guard let jsonData = try? Data(contentsOf: json) else {
        fatalError("Failed to load \(filename) from app bundle.")
    }
    
    let decoder = JSONDecoder()
    
    guard let result = try? decoder.decode(T.self, from: jsonData) else {
        fatalError("Failed to decode \(filename) from app bundle.")
    }
    
    return result
}

但是,在访问 Objs 中的数据时,我在 SwiftUI 预览中收到一个错误,objs.app may have crashed. Check ... for any crash logs in your application这让我相信我错误地使用了 JSONDecoder()。任何帮助表示赞赏!

标签: jsonswift

解决方案


所以这里的问题是你如何解码目标、步骤和好处的内部内容。

Targets/Steps/Benifit 包含对象数组,但在您的Codable结构中,您已将其作为字符串数组给出[String]。您需要更正并检查。

创建一个新结构:

 struct Name : Codable {
      var name : String
 }

您的最终对象将如下所示:

  struct Obj: Codable, Hashable {
          var id:Int
          var title:String
          var targets:[Name]
          var benefits:[Name]
          var steps:[Name]
          var videoURL:String
   }

您应该记住的关键是,在解析嵌套对象时,您必须创建另一个具有可编码一致性的结构。


推荐阅读