You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:36:28