JSONEncoder() кодировка одного ключа разными типами

swift

#1

Здравствуйте товарищи!

У меня возник непреодолимая проблема, как закодировать полезную нагрузку для запроса на сервер. Объект должен выглядеть следующим образом:

{
  "filter": {
     "conditions": [
        {"key": "id_wbs", "values": [1293548]},
        {"key": "id_object", "values": []},
        {"key": "id", "values": [""]},
        {"key": "period", "values": ["month"]},
        {"key": "type_chart", "values": [""]},
        {"key": "tzr_type", "values": ["monthly"]},
        {"key": "type_of_work", "values": []},
        {"key": "id_group_object", "values": []},
        {"key": "report_date", "values": [],
            "value_derived": {
            "columns": "max_report_date",
            "bo_id": 100006,
            "filter": {
                "conditions": [{"key": "id_wbs", "values": [1293548]}, {"key": "operation", "values": [""]}]
                }
            }
        }]
    },
} 

Проблема в ключах “values”. В зависимости от значения ключа “key” они могут быть или массивом целых чисел, или массивом строки, или массивом дат. Откровенно говоря я запутался с этим и сейчас в тупике. Буду благодарен за любую помощь

Предварительная модель данных выглядит так:

struct CSITableRequest: Encodable {
   let filter: TableFilter
}

struct TableFilter: Encodable {
   let conditions: [TableFilterConditionItem]
}

struct TableFilterConditionItem: Encodable {
   let key: TableFilterConditionKey
   let values: [String] // Это проблемный ключ, который может быть и массивом Int, и массивом String, и массивом Date
   let value_derived: TableValueDerived?
}

enum TableFilterConditionKey: String, Encodable {
   case id_wbs
   case id_object
   case id
   case period
   case type_chart
   case tzr_type
   case type_of_work
   case id_group_object
   case report_date 
   case operation
}

struct TableValueDerived: Encodable {
   let columns: String
   let bo_id: Int
   let filter: TableFilter
}

#2

Можете попробовать что-то по типу AnyDecodable

Если количество типо ограничено, можно в enum c ассоциированным значением попробовать положить