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)
代码说明
- 使用
compactMap替代嵌套循环,更简洁地提取所有package的name字段,同时自动过滤nil值 - 主成员的所有package名称被收集到一个数组后,作为单个元素加入
memberPackagesGroup,符合预期的嵌套结构 - 附加成员的处理逻辑保持一致,每个附加成员的packages名称组成一个子数组,添加到
memberPackagesGroup - 最终
arrayOfTests的结构完全匹配预期输出
内容的提问来源于stack exchange,提问作者Abhishek kumar
相关产品推荐
相关产品推荐

