Использование:
==============

ользую Swift 4 и пытаюсь проанализировать некоторые данные JSON, которые, по-видимому, в некоторых случаях могут иметь разные значения типа для одного и того же ключа, например:

а также

Я на самом деле застрял с определением моего`struct` потому что я не могу понять, как справиться с этим делом, потому что

бросает`"Expected to decode String but found a number instead."`и, естественно,

бросает`"Expected to decode Float but found a string/data instead."` соответственно.

Как я могу справиться с этим (и аналогичными) случаями при определении моего`struct`?

 когда пытался декодировать / кодировать «отредактированное» поле в ответе JSON Reddit Listing. Я создал структуру, которая представляет динамический тип, который может существовать для данного ключа. Ключ может иметь логическое или целое число.

Если вам нужно только иметь возможность декодировать, просто используйте init (from :). Если вам нужно пойти в обе стороны, вам нужно будет реализовать функцию encode (to :).

Внутри моего класса Codable я затем использую свою структуру.

**Изменить: более конкретное решение для вашего сценария**

Я рекомендую использовать протокол CodingKey и перечисление для хранения всех свойств при декодировании. Когда вы создаете что-то, что соответствует Codable, компилятор создаст для вас закрытое перечисление CodingKeys. Это позволяет вам решить, что делать, основываясь на ключе свойства JSON Object.

Например, это JSON, который я декодирую:

Если вы хотите привести из String к Double, потому что вам нужно только значение double, просто декодируйте строку, а затем создайте из нее двойное значение. (Это то, что делает Итай Фербер, тогда вам придется также декодировать все свойства, используя try decoder.decode (type: forKey :))

Если вам нужно сохранить тип вместе со значением, вы можете использовать перечисление, соответствующее Codable, вместо структуры. Затем вы можете просто использовать оператор switch со свойством «type» JSONObjectCustomEnum и выполнять действия в зависимости от ситуации.



Одним из простых решений является обеспечение реализации`init(from:)` который пытается декодировать значение как`String`и если это не удается из-за неправильного типа, попытайтесь декодировать как`Double`:



Я должен был расшифровать`PHP/MySQL/PDO` двойное значение, которое задается в виде строки, для этого варианта использования мне пришлось расширить`KeyedDecodingContainer`, вот так:

**Использование:**