Как добавить имя и значение динамического ключа в Encodable (Swift)?

У меня очень простая просьба:

{"token": "abcd", "key": "value" }

Я пытаюсь добавить этот запрос как Encodable. Теперь возникает проблема, что имя key может быть любым, например, «123», «311», тип ключа будет String, но его имя является динамическим. Как я могу добавить динамические имена в Encodable?

struct Answers: Encodable {
  let token: String 
  let key: String 
}

Я пробовал использовать дженерики, но это не сработало. У кого-нибудь есть идеи?


person Rob    schedule 07.05.2020    source источник
comment
А как определить, что это за имя?   -  person PGDev    schedule 07.05.2020
comment
@PGDev Я получаю значение идентификатора для вопроса и это значение, которое я использую для имени.   -  person Rob    schedule 07.05.2020
comment
Вы тоже декодируете? Или используя вышеуказанный запрос напрямую?   -  person PGDev    schedule 07.05.2020
comment
Нет, я буду декодировать, но это будет другое struct, это struct только для запроса.   -  person Rob    schedule 07.05.2020


Ответы (2)


Я не думаю, что Codable допускает такую ​​функциональность в настоящее время. На данный момент вы не можете создать Codable тип с динамическими ключами.

В качестве альтернативы, если вы используете эту модель, вы можете просто создать из нее Dictionary, а затем закодировать с помощью JSONEncoder().

Пример:

let dict = ["token": "abcd", "1234": "value"]
do {
    let response = try JSONEncoder().encode(dict)
    print(response)
} catch {
    print(error)
}
person PGDev    schedule 07.05.2020
comment
Спасибо за ответ, сейчас я делаю то же самое, я подумал, может быть, будет способ обрабатывать динамические ключи. - person Rob; 07.05.2020
comment
@Rob К сожалению, нет. Может быть, получим в будущем. Примите, если ответ помог. Удачного кодирования ???? - person PGDev; 07.05.2020

Роб,

Если бы вы могли изменить ответ JSON, вы можете использовать что-то вроде этого {token: "AAA", data: {"key":"123"}}.

Итак, вы можете создать

struct Response<DataType: Codable>: Codable { 
    let token: String
    let data: DataType
}

С этим Struct вы можете передавать множество комбинаций динамических значений.

Мое решение не работает с вашими фактическими данными, но, возможно, вы можете поговорить с командой об API и, возможно, изменить данные.

person ViTUu    schedule 07.05.2020
comment
Приятно, добро пожаловать! Не стесняйтесь спрашивать, хотите ли вы - person ViTUu; 07.05.2020