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

Swift遍历嵌套JSON数组无法得到目标结果的问题求助

遍历嵌套JSON生成指定嵌套字符串数组的Swift解决方案

预期输出

[ [["P-1 Test one","P-1 Test Two","P-1 Test Three"]], [["P-2 Test One","P-2 Test One"],["P-2 A-1 Test one","P-2 A-1 Test two","P-2 A-1 Test three","P-2 A-1 Test four"],["P-2 A-2 Test one","P-2 A-2 Test two","P-2 A-3 Test three","P-2 A-4 Test four"]], [["P-3 Test One"],["P-3 A-1 Test one","P-3 A-1 Test Two","P-3 A-1 Test three","P-3 A-1 Test four"]] ]

原始JSON响应数据

{ "page_size": 20, "page": 1, "count": 209, "results": [ { "_score": null, "plink_id": "plifnW", "customer_name": "Primary member one", "packages": [ { "is_addon": false, "addon_price": 0, "parameter": 1, "name": "P-1 Test one", "id": 54, "package_city_prices": { "package_price": 160, "offer_price": 99 }, "slug_name": "Test-one-slug" }, { "is_addon": false, "addon_price": 0, "parameter": 1, "name": "P-1 Test Two", "id": 54, "package_city_prices": { "package_price": 160, "offer_price": 99 }, "slug_name": "Test-Two-slug" }, { "is_addon": false, "addon_price": 0, "parameter": 1, "name": "P-1 Test Three", "id": 54, "package_city_prices": { "package_price": 160, "offer_price": 99 }, "slug_name": "Test-Two-slug" } ], "verification_remark": "Duplicate Booking", "additional_members": [] }, { "_score": null, "plink_id": "plifnW", "customer_name": "Primary member two", "packages": [ { "is_addon": false, "addon_price": 0, "parameter": 1, "name": "P-2 Test One", "id": 54, "package_city_prices": { "package_price": 160, "offer_price": 99 }, "slug_name": "Test one slug" }, { "is_addon": false, "addon_price": 0, "parameter": 1, "name": "P-2 Test One", "id": 54, "package_city_prices": { "package_price": 160, "offer_price": 99 }, "slug_name": "Test one slug" } ], "verification_remark": "Duplicate Booking", "additional_members": [ { "plink_id": null, "alloted_time": null, "customer_name": "Additional member one", "packages": [ { "is_addon": false, "tat_time": null, "name": "P-2 A-1 Test one", "slug_name": "Test_one_slug" }, { "is_addon": false, "tat_time": null, "name": "P-2 A-1 Test two", "slug_name": "Test_Two_slug" }, { "is_addon": false, "tat_time": null, "name": "P-2 A-1 Test three", "slug_name": "Test_Three_slug" }, { "is_addon": false, "tat_time": null, "name": "P-2 A-1 Test four", "slug_name": "Test_four_slug" } ] }, { "plink_id": null, "alloted_time": null, "customer_name": "Additional member Two", "packages": [ { "is_addon": false, "tat_time": null, "name": "P-2 A-2 Test one", "slug_name": "Test_one_slug" }, { "is_addon": false, "tat_time": null, "name": "P-2 A-2 Test two", "slug_name": "Test_Two_slug" }, { "is_addon": false, "tat_time": null, "name": "P-2 A-3 Test three", "slug_name": "Test_Three_slug" }, { "is_addon": false, "tat_time": null, "name": "P-2 A-4 Test four", "slug_name": "Test_four_slug" } ] } ] }, { "_score": null, "plink_id": "plifnW", "customer_name": "Primary member Three", "packages": [ { "is_addon": false, "addon_price": 0, "parameter": 1, "name": "P-3 Test One", "id": 54, "package_city_prices": { "package_price": 160, "offer_price": 99 }, "slug_name": "test five slug" } ], "verification_remark": "Duplicate Booking", "additional_members": [ { "plink_id": null, "alloted_time": null, "customer_name": "P-3-A-1 additional member", "packages": [ { "is_addon": false, "tat_time": null, "name": "P-3 A-1 Test one", "slug_name": "Test_one_slug" }, { "is_addon": false, "tat_time": null, "name": "P-3 A-1 Test Two", "slug_name": "Test_Two_slug" }, { "is_addon": false, "tat_time": null, "name": "P-3 A-1 Test three", "slug_name": "Test_Three_slug" }, { "is_addon": false, "tat_time": null, "name": "P-3 A-1 Test four", "slug_name": "Test_four_slug" } ] } ] } ] }

当前尝试的Swift代码

for testResult in self.bookingArray?.results ?? [] { 
    var testPackageArrayOne = [[String]]() 
    for testPackage in testResult.packages ?? [] { 
        testPackageArrayOne.append([testPackage.name ?? ""]) 
    } 
    for member in testResult.additional_members ?? [] { 
        var newAdditionArray = [String]() 
        for additionalMemberTests in member.packages ?? [] { 
            newAdditionArray.append(additionalMemberTests.name ?? "") 
        } 
        testPackageArrayOne.append(newAdditionArray) 
    } 
    print("testPackageArrayOne==>>",testPackageArrayOne) 
    arrayOfTests.append(testPackageArrayOne) 
    print("arrayOfTestArrays==>>",arrayOfTests) 
} 
// Print the resulting array of arrays 
for array in arrayOfTests { 
    print("individual array for every member ==>>",array) 
} 
print("member and additional members array ==>>",self.memberNameArray)

问题分析

当前代码的核心问题是处理主成员的packages时,将每个package的名称单独包装成一个子数组添加到testPackageArrayOne,导致主成员的packages被拆分为多个子数组,而预期是将主成员的所有package名称放在同一个子数组中,再添加到外层数组。

修正后的Swift代码

// 初始化结果数组
var arrayOfTests: [[[String]]] = []

// 遍历每个主成员
for testResult in self.bookingArray?.results ?? [] {
    var memberPackagesGroup = [[String]]()
    
    // 处理主成员的packages:收集所有名称到一个数组,再作为子数组加入
    let primaryPackageNames = testResult.packages?.compactMap { $0.name } ?? []
    memberPackagesGroup.append(primaryPackageNames)
    
    // 处理每个附加成员的packages
    for member in testResult.additional_members ?? [] {
        let addonPackageNames = member.packages?.compactMap { $0.name } ?? []
        memberPackagesGroup.append(addonPackageNames)
    }
    
    // 将当前成员的包组加入结果数组
    arrayOfTests.append(memberPackagesGroup)
}

// 打印验证结果
print("最终结果:", arrayOfTests)

代码说明

  1. 使用compactMap替代嵌套循环,更简洁地提取所有package的name字段,同时自动过滤nil值
  2. 主成员的所有package名称被收集到一个数组后,作为单个元素加入memberPackagesGroup,符合预期的嵌套结构
  3. 附加成员的处理逻辑保持一致,每个附加成员的packages名称组成一个子数组,添加到memberPackagesGroup
  4. 最终arrayOfTests的结构完全匹配预期输出

内容的提问来源于stack exchange,提问作者Abhishek kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:44:57