Если это двойное кодирование, то вам просто нужно двойное декодирование. Если я правильно понимаю, входящие данные выглядят так:
let str = #""{\"key\":\"value\"}""#
// "{\\"key\\":\\"value\\"}"
Первый байт "
, второй байт {
, третий байт \
, четвертый байт "
.
Это строка, кодированная JSON. Итак, декодируем это как строку (было время, когда это не работало, потому что это «фрагмент», но в настоящее время он работает нормально, по крайней мере, во всех моих тестах):
let decoder = JSONDecoder()
let string = try! decoder.decode(String.self, from: Data(str.utf8)) // {"key":"value"}
И затем декодируем это как ваш тип ([String:String]
только для примера):
let result = try! decoder.decode([String:String].self, from: Data(string.utf8))
// ["key": "value"]
(IMO, этот тип двойного кодирования - это хорошо, кстати, и я не уверен, почему так много комментариев по этому поводу. Сериализация произвольного объекта во многих случаях имеет гораздо больше смысла, чем принуждение схемы работать с произвольной структурой. Пока она четко закодирована, я не вижу здесь никакой проблемы.)