Я пытаюсь получить результат, используя цикл for внутри вложенного ответа, но не получаю требуемого результата. Я попробовал, но не получил желаемого ответа. Требуемый результат приведен ниже.
[
[["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"
}
]
}
]
}
]
}
Здесь, в этом ответе, параметр «additional_mamber» может быть пустым или иметь несколько членов или тестов. Я использовал следующий код, чтобы получить результат.
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)
Но не получив желаемого результата.
Не уверен, зачем вам нужен третий уровень вашего массива, но с использованием функционального программирования (map, FlatMap) все должно быть довольно просто:
let data = Data("""
{
"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"
}
]
}
]
}
]
}
""".utf8
)
// MARK: - Booking
struct Booking: Codable {
let pageSize, page, count: Int
let results: [Result]
enum CodingKeys: String, CodingKey {
case pageSize = "page_size"
case page, count, results
}
}
// MARK: - Result
struct Result: Codable {
// let score: Int?
let plinkID, customerName: String
let packages: [ResultPackage]
let verificationRemark: String
let additionalMembers: [AdditionalMember]
enum CodingKeys: String, CodingKey {
// case score = "_score"
case plinkID = "plink_id"
case customerName = "customer_name"
case packages
case verificationRemark = "verification_remark"
case additionalMembers = "additional_members"
}
}
// MARK: - AdditionalMember
struct AdditionalMember: Codable {
// let plinkID: String?
// let allotedTime: Date?
let customerName: String
let packages: [AdditionalMemberPackage]
enum CodingKeys: String, CodingKey {
// case plinkID = "plink_id"
// case allotedTime = "alloted_time"
case customerName = "customer_name"
case packages
}
}
// MARK: - AdditionalMemberPackage
struct AdditionalMemberPackage: Codable {
let isAddon: Bool
// let tatTime: Date?
let name, slugName: String
enum CodingKeys: String, CodingKey {
case isAddon = "is_addon"
// case tatTime = "tat_time"
case name
case slugName = "slug_name"
}
}
// MARK: - ResultPackage
struct ResultPackage: Codable {
let isAddon: Bool
let addonPrice, parameter: Int
let name: String
let id: Int
let packageCityPrices: PackageCityPrices
let slugName: String
enum CodingKeys: String, CodingKey {
case isAddon = "is_addon"
case addonPrice = "addon_price"
case parameter, name, id
case packageCityPrices = "package_city_prices"
case slugName = "slug_name"
}
}
// MARK: - PackageCityPrices
struct PackageCityPrices: Codable {
let packagePrice, offerPrice: Int
enum CodingKeys: String, CodingKey {
case packagePrice = "package_price"
case offerPrice = "offer_price"
}
}
let bookingArray = try? JSONDecoder().decode(Booking.self, from: data)
var results: [[[String]]] = []
for result in bookingArray?.results ?? [] {
let packages = result.packages.map(\.name)
let additionalMembers = result.additionalMembers.flatMap(\.packages).map(\.name)
if additionalMembers.isEmpty {
results.append([packages])
} else {
results.append([packages, additionalMembers])
}
}
for res in results {
print(res)
}
Должно напечатать:
[["Первый тест P-1", "Второй тест P-1", "Третий P-1"]]
[["Первый тест P-2", "Первый тест P-2"], ["Первый тест P-2 A-1", "Второй тест P-2 A-1", "Тест P-2 A-1 три", "P-2 A-1 Тест четыре", "P-2 A-2 Тест один", "P-2 A-2 Тест два", "P-2 A-3 Тест три", "P- 2 А-4 Тест четыре"]]
[["P-3 Тест первый"], ["P-3 A-1 Тест один", "P-3 A-1 Тест два", "P-3 A-1 Тест три", "P-3 A -1 Тест четвертый"]]
или даже проще
let results = bookingArray?.results.map { result in
let packages = result.packages.map(\.name)
let additionalMembers = result.additionalMembers.flatMap(\.packages).map(\.name)
return additionalMembers.isEmpty ? [packages] : [packages, additionalMembers]
} ?? []
Привет, Лео! Спасибо за ответ. Я пробовал использовать то же самое, но получил проблему, как показано ниже. «Невозможно определить тип ключевого пути из контекста; рассмотрите возможность явного указания корневого типа» и «Значение типа «[BookingListAdditionalMember]» не имеет пакетов-членов»
Просто проверьте правильное имя свойства вашей модели. Я использовал то же самое, что показано в вашем примере. Xcode должен автоматически заполнить его по истечении периода
если я использую, пусть дополнительныеMembers = result.additional_members.flatMap(\.first?.packages).map(\.first?.name) ошибка не отображается
Если вы отредактируете свой вопрос и опубликуете декларацию модели, я могу помочь вам исправить ее правильно.
На самом деле модель представляет собой очень большие данные. Но позвольте мне попытаться получить только соответствующие данные.
@Abhishekkumar Проверьте мое последнее редактирование. При необходимости вы можете изменить модель.
Существующая модель использует сопоставитель объектов. А предыдущий разработчик, работавший над этим проектом, создал функцию внутри модели представления и использовал ту же модель в функции callApi. Поэтому я пытаюсь сделать то же самое. но редактирование, которое вы предоставили, можно кодировать.
func getAllBookingListApiCall(){ params = ["page": pageCount]; viewModel.callGetApi(params: params) {status, data, errorMsg in if self.pageCount == 1 { self.bookingArray = data let bookings: [BookingListResults]? = data.results var activeOrderResults: [BookingListResults] = [] var PastOrderResults: [BookingListResults] = [] это функция, в которой я пытаюсь получить результат
Сделайте себе одолжение и избавьтесь от Object Mapper. Codable
существует уже более 5 лет. Кстати, отредактируйте свой пост. Не публикуйте код в разделе комментариев.
Да, в этом проекте есть многое, что необходимо обновить и изменить. Вот почему я ищу временное решение, где я могу использовать здесь массивы, чтобы решить проблему.
пусть bookingArray = попробовать? JSONDecoder().decode(Booking.self, from: data) Можете ли вы сказать мне, что мне следует использовать перед строкой выше? я написал код ниже: let jsonResponse = попробуйте JSONSerialization.jsonObject(with: data, options: .allowFragments) как AnyObject print("all data new==>>",jsonResponse) и также получаю ответ. но после этой строки пусть bookingArray = try? JSONDecoder().decode(Booking.self, from: data) становится пустым
Я опубликовал весь код, который вам нужен. data
должен быть ответом данных в формате JSON от вашего бэкэнда. Вместо этого используйте do { let bookingArray = try JSONDecoder().decode(Booking.self, from: data) } catch { print(error) }
и проверьте ошибку декодирования. Обязательно используйте собственный JSONDecoder, если вам нужна собственная dateDecodingStrategy.
Я попробовал это, используя блок do-catch, и, наконец, получил ошибку, из-за которой получал пустой массив. Ошибка была «valueNotFound(Swift.Int, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: «results», intValue: nil))....» некоторые значения из ответа могут быть нулевыми. После удаления этих значений Я получил желаемый результат. Большое спасибо, Лео :).
Эй, Лео, можешь ли ты хоть раз взглянуть на этот вопрос ниже? stackoverflow.com/questions/78645988/…
Не уверен, почему ОП получает отрицательные голоса, а его пост получает голоса за закрытие. Мне кажется довольно ясным вопрос относительно ожидаемых результатов ОП.