Swift 4 - Как структурировать объект json и использовать decodable в switch (не работает)
Я пытаюсь создать структуру для следующего объекта json, используя swift decodable.
{
"template": [
{
"id": 8,
"question": "Favorite Color?",
"category": "Color",
"section": "Favorite Colors",
"is_active": 1,
},
[
{
"id": 14,
"question_id": 8,
"option_name": "Red",
"is_active": 1,
},
{
"id": 16,
"question_id": 8,
"option_name": "Orange",
"is_active": 1,
}
],
{
"id": 9,
"question": "What cars do you drive?",
"category": "Cars",
"section": "Favorite Cars",
"is_active": 1,
},
[
{
"id": 15,
"question_id": 9,
"option_name": "Toyota",
"is_active": 1,
},
{
"id": 18,
"question_id": 9,
"option_name": "Honda",
"is_active": 1,
},
{
"id": 19,
"question_id": 9,
"option_name": "BMW",
"is_active": 1,
}
]
]
}
У меня есть такие, как:
public struct GameTemplate:Decodable {
question:String?
}
public struct Game:Decodable {
let template[GameTemplate]
}
По какой-то причине, когда я попытался разобрать, что это не работает, я получаю сообщение об ошибке, утверждающее, что структура не является словарем. Я пытался привести значение struct, но это не сработало, просто нужно получить хороший и чистый объект json после декодирования.
1 ответ
Ваш JSON
Формат не соответствует.
Просто возьмите первую категорию color
:
{
"template": [
{
"id": 8,
"question": "Favorite Color?",
"category": "Color",
"section": "Favorite Colors",
"is_active": 1,
},
[
{
"id": 14,
"question_id": 8,
"option_name": "Red",
"is_active": 1,
},
{
"id": 16,
"question_id": 8,
"option_name": "Orange",
"is_active": 1,
}
],
]
}
template
является array
имеющий dictionary
по индексу 0 и массив по 1 индексу. Это декодируется по-другому, но это дополнительное усилие.
Если возможно, сделайте JSON
Данные согласованы и клубные категории в одном индексе массива как:
{
"template": [
{
"id": 8,
"question": "Favorite Color?",
"category": "Color",
"section": "Favorite Colors",
"is_active": 1,
"subCategory": [
{
"id": 14,
"question_id": 8,
"option_name": "Red",
"is_active": 1,
},
{
"id": 16,
"question_id": 8,
"option_name": "Orange",
"is_active": 1,
}
]
}
]
}
и так же клубят разные категории автомобилей.
Вам будет легко декодировать как:
public struct GameTemplate:Decodable {
question: String?
subCategory: [SubCategory]
}
public struct SubCategory:Decodable {
option_name: String?
}
public struct Game:Decodable {
let template: [GameTemplate]
}
Надеюсь, вы понимаете, что я пытаюсь объяснить.