我收到一個 JSON:
{
"categories":
[
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name"
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name"
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
},
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name",
"children":
[
{
"category_name": "example name"
},
{
"category_name": "example name"
},
{
"category_name": "example name"
}
]
}
]
}
]
}
可以看出,資料是一種遞回格式。我能夠撰寫代碼以將其解碼為我的自定義型別,即:
struct Category: Codable {
let categoryName: String
let children: [Category]?
}
現在,對于任何類別,我都想知道它的“路徑”。如,我想知道所有超級(祖先)類別是什么。因此,對于“平板電腦”類別,我希望能夠遍歷向下鉆取結構的樣子,在這種情況下可能看起來像:
Electronics -> Computers -> Laptops and Tablets -> Tablets
如何構建我的代碼或資料模型以便能夠檢索任何類別的此資訊?
uj5u.com熱心網友回復:
這是一個基本的遞回解決方案,它將元素的路徑添加到陣列中,其中根元素作為第一個元素,目標元素作為最后一個元素。
它使用contains()所以Category需要符合,Equatable或者可以更改為使用 `contains(where:) 代替
contains(where: { $0.categoryName == target.categoryName })
如果這是一個更實際的解決方案。
func extractChain(for target: Category, parent: Category, chain: inout [Category]) {
guard let children = parent.children else {
chain = []
return
}
chain.append(parent)
if children.contains(target) {
chain.append(target)
return
}
for category in children where category.children != nil {
extractChain(for: target, parent: category, chain: &chain)
if !chain.isEmpty { return }
}
chain = [] // No match, clear the array
}
我只做了一些基本測驗,一個匹配到第 3 級,一個沒有匹配,所以可能需要進一步測驗。
uj5u.com熱心網友回復:
您可以像這樣使用類和祖先:
class Category: Codable {
let categoryName: String
let children: [Category]?
var parentCategory: Category?
func setupAncestors(ancestor: Category?) {
category.ancestor = ancestor
for child in children {
setupAncestor(ancestor: self, forCategory: child)
}
func ancestors() [Category] {
if let ancestor = ancestor {
var ancestorList = [ancestors]
ancestorList.append(contentsOf: ancestor.ancestorList ()
return ancestorList
}
return []
}
}
您可以更改順序和/或僅回傳串列中的 categoryName
uj5u.com熱心網友回復:
首先,您需要將路徑添加到 Category,以便您可以在某個地方存盤資料。為方便起見,我還將添加一個 CategoriesResponse 來處理頂層結構,但這并不是很重要:
struct CategoriesResponse: Decodable {
var categories: [Category]
}
struct Category {
let path: [String]
let categoryName: String
let children: [Category]
}
(我假設您想要的只是父類別的名稱。如果您想要某種參考,這是可能的,但資料結構會變得更復雜一些。不過,這種基本方法仍然有效。讓我知道如果您需要類似的東西,我可以擴展答案。)
當然還有標準的 CodingKeys 東西:
private enum CodingKeys: String, CodingKey {
case categoryName = "category_name"
case children
}
解決方案的核心是您需要一個可以接受 KeyedDecodingContainer(而不是解碼器)和路徑的 init,并處理解碼其他所有內容。
// For each element, decode out of the container by hand rather than recursing into init(from: Decoder)
private init(from container: KeyedDecodingContainer<CodingKeys>, path: [String]) throws {
// Track our own path up to this point
self.path = path
// Unload the usual stuff
self.categoryName = try container.decode(String.self, forKey: .categoryName)
// Construct the children, one element at a time (if children exists)
var children: [Category] = []
if container.contains(.children) {
// Extract the array of children
var childrenContainer = try container.nestedUnkeyedContainer(forKey: .children)
while !childrenContainer.isAtEnd {
// Extract the child object
let childContainer = try childrenContainer.nestedContainer(keyedBy: CodingKeys.self)
// For each child, extend the path, decode
let child = try Category(from: childContainer, path: path [self.categoryName])
// And append
children.append(child)
}
}
self.children = children
}
最后,您需要一個 Decodable 實作來啟動它:
extension Category: Decodable {
// Top level decoder to kick everything off
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
try self.init(from: container, path: [])
}
}
With that, it should work as expected using a standard Decoder:
let categories = try JSONDecoder().decode(CategoriesResponse.self, from: json).categories
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442694.html
