Swift Codable, значение массива в качестве ключа - PullRequest
0 голосов
/ 05 ноября 2018

Итак, это мой JSON:

{
 "items": [{
    "name": "Item 1",
    "description": "This is Item 1",
    "categories": ["Category1", "Category2", "Category3", "Category4"],
    "size": ["M", "L"]
 },{
    "name": "Item 2",
    "description": "This is Item 2",
    "categories": ["Category1", "Category3", "Category4"],
    "size": ["M"]
 }]
}

Я могу отлично читать и печатать

Однако я хочу изменить эту структуру на такую, где каждый элемент разделен по категориям и размеру и где категории используются в качестве ключей.

{
 "categories": {
  "category1": [{
   "name": "Item 1",
   "description": "This is Item 1",
   "size": "M"
},{
   "name": "Item 1",
   "description": "This is Item 1",
   "size": "L"
},{
   "name": "Item 2",
   "description": "This is Item 2",
   "size": "M"
}...],
 "category2": [{
  ...
}]
}

Я создал следующую структуру данных, но я не совсем уверен, как продолжить:

struct Categories: Codable {
 let category: String
 let items: [Item]

 struct Item: Codable {
  let name, description, size: String
 }
}

Является ли Codable правильным решением для этого? Если так; Как бы я продолжил, чтобы достичь этого?

1 Ответ

0 голосов
/ 05 ноября 2018

Для вашего текущего JSON вам нужно

struct Root: Codable {
    let categories: [String:[Item]]
}

struct Item: Codable {
    let name, description, size: String
}

Но я думаю, что лучше сделать так

{

    "category1": [{
       "name": "Item 1",
       "description": "This is Item 1",
       "size": "M"
       },{
       "name": "Item 1",
       "description": "This is Item 1",
       "size": "L"
       },{
       "name": "Item 2",
       "description": "This is Item 2",
       "size": "M"
    }],
    "category2": [{

    }]

}

Что заставит вас сделать это

let res = try? JSONDecoder().decode([String:[Item]].self,from:jsonData)

Без структуры Root и бесполезной клавиши categories

...