如何使用codable和swift递归解析json
我试图定义一个解码类模型来解码这种json文件: 这里有一个简短的提取来理解这个问题,实际上它是嵌套的如何使用codable和swift递归解析json,swift,recursion,codable,Swift,Recursion,Codable,我试图定义一个解码类模型来解码这种json文件: 这里有一个简短的提取来理解这个问题,实际上它是嵌套的 { "Title" : "Root", "Subtitle" : "RootTree", "Launch" : [ { "DisplayName" : "Clients", "Launch" : [ { "DisplayName" :
{
"Title" : "Root",
"Subtitle" : "RootTree",
"Launch" : [
{
"DisplayName" : "Clients",
"Launch" : [
{
"DisplayName" : "Clients Details",
"Launch" : [
{
"DisplayName" : "Item1",
"URI" : "/rest/..."
},
{
"DisplayName" : "Item2",
"URI" : "/rest/..."
},
{
"DisplayName" : "Item3",
"URI" : "/rest/..."
}
]
}
]
}
]
}
在我的结构中,由于递归用法,我使用了一个类:
final类Url:Codable{
let name:String
让uri:字符串?
让我们启动:[启动结构]?
枚举编码键:字符串,编码键{
案例名称=“显示名称”
case uri=“uri”
案例发布=“发布”
}
}
最终类启动结构:可编码{
让我们启动:[Url]
枚举编码键:字符串,编码键{
案例发布=“发布”
}
}
我对标题和副标题不感兴趣,因此我将其排除在课堂之外。我想从项目中获取Displayname和uri。正如我所说的,结构更加嵌套,但始终是相同的结构。是否可以使用递归方式读取元素。
我将以这种方式对其进行解码:
...
let result = Result { try JSONDecoder().decode(LaunchStructure.self, from: data) }
谢谢你,问好
Arnold这里根本不需要两种类型,只要一种就可以了:
struct Item: Codable {
let name : String? // not all entries in your example has it, so it's optional
let uri: String?
let launch: [Item]? // same here, all leaf items doesn't have it
enum CodingKeys: String, CodingKey {
case name = "DisplayName"
case uri = "URI"
case launch = "Launch"
}
}
看看这个:@Arnold我想你提供的代码是用来解码的,不是吗?@Bohdan为什么,不是吗?我尝试了这个代码,但没有成功。我也在[LaunchStructure.self]中尝试过,但没有成功。我的课怎么了?如果可能的话,我想用两个类或最多三个类来解析json,因此是递归方法。也许你能给我一个提示。结构是。。。总是一样的结构。实际上不是。最外面的字典没有
URI
和DisplayName
键,中间的字典没有URI
键,内部字典没有launch
键。@vadian是的,你是对的。但我的意思是,因此我有选择权。但是我们总是有一个名为launch的数组,这个数组中的元素有一个名称和其他数组,最后一步是一个名为name和uri的项。但你是对的,不是同样的结构,而是重复的结构。