Swifty JSON: преобразовать иерархический список объектов в массивах JSON в иерархические объекты Swift - PullRequest
0 голосов
/ 22 мая 2019

У меня есть приведенный ниже формат JSON, принадлежащий магазину, который находится внутри этого объекта json, Data поле представляет собой массив JSON, состоящий из иерархии категорий товаров, категории которых хранятся во вложенном иерархическом формате (у каждой категории есть дочерние икаждый дочерний элемент может иметь своих собственных дочерних элементов и т. д.).

{"Data":[
            {"ID":1,"ParentCategoryId":0,"Name": "Parent1","Children":
                [
                    {"ID":2,"ParentCategoryId":1,"Name": "P1Child1","Children":[]},
                    {"ID":3,"ParentCategoryId":1,"Name": "P1Child2","Children":[]},
                    {"ID":4,"ParentCategoryId":1,"Name": "P1Child3","Children":[]},
                    {"ID":5,"ParentCategoryId":1,"Name": "P1Child4","Children":[]},
                ]
            },
            {"ID":6,"ParentCategoryId":0,"Name": "Parent2","Children":
                [
                    {"ID":7,"ParentCategoryId":6,"Name": "P2Child1","Children":[]},
                    {"ID":8,"ParentCategoryId":6,"Name": "P2Child2","Children":[]},
                    {"ID":9,"ParentCategoryId":6,"Name": "P2Child3","Children":[]}
                ]
            }
        ]
}

Чтение этого формата с использованием Swifty JSON usign json["Data"].array возвращает плоский список категорий, которые не имеют иерархии.Я хочу знать, как я могу прочитать этот иерархический объект JSON при сохранении его структуры.Вот текущая структура моего Модельного Объекта (который не включен в поле «Дети», но должен быть изменен):

open class ProductCategory: NSObject {


    var idd                 :  NSInteger
    var name                :  String
    var parentCategoryId    :  NSInteger
    ...

}

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

Если вы используете Codable, вам не нужен SwiftyJSON, вы можете просто сделать:

        do {
            let productsData = try JSONDecoder().decode(ProductsDataResponse.self, from: (jsonString.data(using: .utf8))!)
        } catch let e {
            print("Couldn't Parse data because... \(e)")
        }

Где ProductsDataResponse:

struct ProductsDataResponse: Codable {
    let data: [ProductCategory]

    enum CodingKeys: String, CodingKey {
        case data = "Data"
    }
}
0 голосов
/ 22 мая 2019

Если вы можете рассмотреть вопрос о переходе от swiftyjson к JSONSerialization , то следующее должно дать вам структуру, за которой вы следуете

do {
    if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
        if let categories = json["Data"] as? [[String: Any]] {            
          //map data to your classes here
        }
    }
} catch {
    print("Decode failed: \(error)")
}
0 голосов
/ 22 мая 2019

Вот как вы можете смоделировать это, используя Codable

struct MyData: Codable {
    let data: [Datum]

    enum CodingKeys: String, CodingKey {
        case data = "Data"
    }
}

struct Datum: Codable {
    let id, parentCategoryID: Int
    let name: String
    let children: [Datum]

    enum CodingKeys: String, CodingKey {
        case id = "ID"
        case parentCategoryID = "ParentCategoryId"
        case name = "Name"
        case children = "Children"
    }
}

do {
    let myData = try JSONDecoder().decode(MyData.self, from: yourJsonData)
} catch {
    print(error)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...