Группировка контента JSON - PullRequest
0 голосов
/ 17 апреля 2019

Это мой JSON:

[
  {
    "category" : {
      "id" : 1,
      "text" : "cat1"
    },
    "id" : 1,
    "title" : "book1"
  },{
    "category" : {
      "id" : 2,
      "text" : "cat2"
    },
    "id" : 2,
    "title" : "book2"
  },{
    "category" : {
      "id" : 1,
      "text" : "cat1"
    },
    "id" : 3,
    "title" : "book3"
  }
]

Как я могу сгруппировать его по категориям? я хочу использовать их в различных collectionView

Заранее спасибо

enter image description here

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Определите ваши кодируемые классы JSON следующим образом.

typealias Result = [ResultElement]

struct ResultElement: Codable {
    let category: Category
    let id: Int
    let title: String
}

struct Category: Codable {
    let id: Int
    let text: String
}

Теперь итерируйте массив Result после разбора JSON, используя JSONDecoder, сравните структуру Category с помощью равного оператора и сгруппируйте ее. Поскольку Int и String внутри структуры категорий по умолчанию соответствует протоколу Equatable, структуру категорий также можно сравнивать с использованием протокола Equatable.

1 голос
/ 17 апреля 2019
  1. Создание структур

    //MARK: - MyData
    public struct MyData {
    
        public var category : Category
        public var id : Int
        public var title : String
    
    }
    
    //MARK: - Category
    public struct Category {
    
        public var id : Int
        public var text : String
    
    }
    
  2. Создать модель

    func createData () -> [MyData] {
        let c1 = Category.init(id: 1, text: "Cat1")
        let d1 = MyData.init(category: c1, id: 1, title: "Book1")
        let c2 = Category.init(id: 2, text: "Cat2")
        let d2 = MyData.init(category: c2, id: 2, title: "Book2")
        let c3 = Category.init(id: 1, text: "Cat1")
        let d3 = MyData.init(category: c3, id: 3, title: "Book3")
    
        return [d1, d2, d3]
    
    }
    
  3. Сгруппируйте ваши данные

        let ungroupedData = createData()
        print("Ungrouped\n")
        print(ungroupedData)
        let groupedData = Dictionary(grouping: ungroupedData, by: {$0.category.text})
        print("\nGrouped\n")
        print(groupedData)
    
        groupedData["Cat1"] // get cat1 array list
    
1 голос
/ 17 апреля 2019

Можно попробовать

        let str = """
[
{
"category" : {
"id" : 1,
"text" : "cat1"
},
"id" : 1,
"title" : "book1"
},{
"category" : {
"id" : 2,
"text" : "cat2"
},
"id" : 2,
"title" : "book2"
},{
"category" : {
"id" : 1,
"text" : "cat1"
},
"id" : 3,
"title" : "book3"
}
]


"""

        do {

            let res = try JSONDecoder().decode([Root].self, from: Data(str.utf8))

            print(res)

            let dic = Dictionary(grouping: res, by: { $0.category.text})

            print(dic) // this dictionary is your new data source key is title of section value is sections rows 
        }
        catch {
            print(error)
        }

struct Root: Codable {
    let category: Category
    let id: Int
    let title: String
}

struct Category: Codable {
    let id: Int
    let text: String
}
...