Преобразование строкового ответа JSON в логическое значение с использованием Swift 4 Decodable

Я рефакторинг некоторых проектов, где я ранее использовал сторонние синтаксические анализаторы JSON, и я столкнулся с глупым сайтом, который возвращает логическое значение в виде строки.

Это соответствующий фрагмент ответа JSON:

{
    "delay": "false",
    /* a bunch of other keys*/
}

Моя структура для декодирования выглядит так:

struct MyJSONStruct: Decodable {
  let delay: Bool
  // the rest of the keys
}

Как мне преобразовать строку, возвращаемую в ответе JSON, в Bool, чтобы она соответствовала моей структуре в Swift 4? Хотя это сообщение было полезным , я не могу понять, как преобразовать строковый ответ в логическое значение.


person Adrian    schedule 20.10.2017    source источник
comment
переопределить init(decoder: Decoder) и вручную обработать ВСЕ декодирование. Я говорю все, потому что вы не можете произвольно декодировать одни поля, а другие нет.   -  person Brandon    schedule 20.10.2017
comment
Ой. У меня есть ~ 20 ключей с некоторыми вложенными структурами, все для одного логического значения.   -  person Adrian    schedule 20.10.2017
comment
Сравните stackoverflow.com/q/44594652/2976878   -  person Hamish    schedule 20.10.2017


Ответы (2)


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

struct MyJSONStruct: Decodable {
   var delay: String
   // the rest of the keys

   var boolDelay : Bool {
       get { return delay == "true" }
       set { delay = newValue ? "true" : "false" }
   }
}
person vadian    schedule 20.10.2017
comment
Ой! Это блестяще! Я бы предпочел добавить 3 строки кода, чем собственный инициализатор. Благодарю вас! - person Adrian; 20.10.2017
comment
@LeoDabus Я изменил let на var. Еще раз спасибо за этот простой обходной путь. - person Adrian; 20.10.2017

вам нужно установить boolEncoding: .literal в инициализаторе URLEncoding.

boolEncoding: .literal
person Akshay Khadke    schedule 12.02.2020