Swift 4解析可变键JSON并填充指定数组的实现方法
Swift 4解析动态键名JSON并填充目标数组方案
这个动态键名的JSON解析需求在Swift 4里用Codable就能很优雅地解决,我给你一步步拆解实现方案:
1. 定义对应的数据模型
首先我们需要定义两个结构体:一个对应JSON里每个分类下的子项,另一个是你需要的ExpandableNames结构:
// 对应JSON中每个父分类下的子条目 struct CategoryItem: Codable { let kategoriisim: String let uyevarmi: String } // 你需要的ExpandableNames结构体,baslik字段用来存储父键名 // 如果需要关联对应的子项数组,可以添加items属性(推荐,方便后续使用) struct ExpandableNames { let baslik: String // 可选:如果需要绑定子项数组,取消注释下面一行 // let items: [CategoryItem] }
2. 初始化目标存储数组
按照你的需求定义两个数组:
// 存放所有子分类数组的二维数组 var arrayCategory: [[CategoryItem]] = [] // 存放ExpandableNames对象的数组 var dimensionalArray: [ExpandableNames] = []
3. 解析JSON并填充数组
因为JSON的顶级键是动态的,我们可以直接将整个JSON解析成[String: [CategoryItem]]类型的字典,然后遍历字典来填充两个数组:
// 示例JSON数据(实际场景中可能来自网络请求或本地文件) let jsonString = """ { "Elektronik": [ { "kategoriisim": "Akıllı Saatler", "uyevarmi": "1" }, { "kategoriisim": "Anakart", "uyevarmi": "1" } ], "Hobi": [ { "kategoriisim": "Drone Multikopter", "uyevarmi": "1" } ] } """ // 将JSON字符串转为Data(如果是网络请求直接拿到Data可跳过这步) guard let jsonData = jsonString.data(using: .utf8) else { print("无法将JSON字符串转换为Data") return } do { // 解析动态键字典:键是父分类名称,值是对应的子项数组 let categoryDictionary = try JSONDecoder().decode([String: [CategoryItem]].self, from: jsonData) // 遍历字典,填充两个目标数组 for (parentKey, childItems) in categoryDictionary { // 将当前子项数组加入arrayCategory arrayCategory.append(childItems) // 创建ExpandableNames实例并加入dimensionalArray // 如果ExpandableNames有items属性,就改成: // let expandableItem = ExpandableNames(baslik: parentKey, items: childItems) let expandableItem = ExpandableNames(baslik: parentKey) dimensionalArray.append(expandableItem) } // 可选:打印结果验证 print("arrayCategory内容:\(arrayCategory)") print("dimensionalArray中的分类名:\(dimensionalArray.map { $0.baslik })") } catch { print("JSON解析失败:\(error.localizedDescription)") }
额外说明
如果你的业务逻辑需要ExpandableNames同时关联对应的子项数组,建议给结构体添加items属性(注释里那行),这样后续使用时不用单独维护两个数组的对应关系,会更安全和方便。
内容的提问来源于stack exchange,提问作者Emre Kacan
相关产品推荐
相关产品推荐

