如何使用codable和swift递归解析json

如何使用codable和swift递归解析json,swift,recursion,codable,Swift,Recursion,Codable,我试图定义一个解码类模型来解码这种json文件: 这里有一个简短的提取来理解这个问题,实际上它是嵌套的 { "Title" : "Root", "Subtitle" : "RootTree", "Launch" : [ { "DisplayName" : "Clients", "Launch" : [ { "DisplayName" :

我试图定义一个解码类模型来解码这种json文件: 这里有一个简短的提取来理解这个问题,实际上它是嵌套的

{
    "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的项。但你是对的,不是同样的结构,而是重复的结构。