Мне интересно, есть ли способ получить данные на нескольких уровнях объекта JSON, который я сопоставил в моделях?
Где $0.product
, есть также массив назван [Promotions]
. Итак, в идеале я хотел бы иметь возможность вытащить в $0.promotion
, а также $0.product
и вставить их в один и тот же объект (testData
).
self.holdTestData = testArray
.compactMap { $0.search }
.compactMap { $0.data }
.flatMap { $0.results }
.compactMap { $0.productItems }
.compactMap { $0.product }
.map {
testData(
name: $0.title,
id: $0.id,
weight: nil,
Logo: "logo",
price: nil,
doublePrice: $0.price,
imageURL: $0.defaultImageURL,
barcode: ""
)
}
Имена выше являются t фактические имена моих объектов в проекте только потому, что проект является частным. Я постараюсь изо всех сил показать вам, что происходит от testArray: -
var testArray: [TestSearch]?
struct TestSearch: Codable {
let search: Search
}
struct Search: Codable {
let data: DataClass
}
struct DataClass: Codable {
let query: String
let results: Results
}
struct Results: Codable {
let productItems: [ProductItem]
}
struct ProductItem: Codable {
let promotions: [Promotion]
let product: TestProduct
}
struct Promotion: Codable {
let promotionID, promotionType, startDate, endDate: String
let offerText: String
enum CodingKeys: String, CodingKey {
case promotionID = "promotionId"
case promotionType, startDate, endDate, offerText
}
}
Сообщите мне, если вам также нужно, чтобы я включил структуру продукта
РЕШЕНИЕ:
Мне нужно было go подняться на уровень, а затем оттуда составить карту: -
self.holdTestData = testArray.compactMap{
$0.search
}.compactMap{
$0.data
}.compactMap{
$0.results
}.flatMap{
$0.productItems
}.compactMap{
testData(name: $0.product.title, id: $0.product.id, weight: nil, Logo: "logo", price: nil, doublePrice: $0.product.price, imageURL: $0.product.defaultImageURL, barcode: "", offerText: $0.promotions.isEmpty ? "" : $0.promotions[0].offerText)