json - 如何使用 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()。任何帮助表示赞赏!
解决方案
所以这里的问题是你如何解码目标、步骤和好处的内部内容。
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
}
您应该记住的关键是,在解析嵌套对象时,您必须创建另一个具有可编码一致性的结构。
推荐阅读
- json - xslt 用模板匹配替换数组标签名称
- angular - 添加 totalstars 选项时,ng 星级评分不起作用
- sql - SQL如何根据“较早日期”条件选择多个列
- c# - Razor 页面与服务器端 Blazor
- css - 如何为动画设置离子菜单过渡效果
- android - Android:即使在 LocationSettingsRequest 中使用 setEnableBle 后也无法扫描 BLE 设备
- ssl - 无法使用在 fabric-ca 中启用的 tls 注册对等点
- ios - iOS Safari 在按下浏览器后退按钮后清除表单字段
- php - php如何检查变量字符串?
- laravel - 从传单中的数据库加载标记