Для следующего ответа код не тестируется на компиляторе, возможно, существует некоторая проблема с опечатками, которую можно легко исправить, некоторые из них намеренно сделаны, чтобы вызвать логику, лежащую в основе, и не добавляются с помощью if let
/ guard let
, as?
и т. Д., Которые необходимы, но добавляют шум в объяснение.
Я не буду повторять @ vadian ответ , что является правильным объяснением, почему оно терпит неудачу.
Итак, нам ясно, что dict["message"]
это String
.
Часть информации, которая, по-видимому, отсутствует в аббревиатуре JSON, предназначена для обозначения "N": нотация.
Когда вы печатали dict["message"]
, у вас действительно не было объекта ключ / значение, у вас есть строка, представляющая объект ключ-значение, но не в представлении Swift. Вы напечатали JSON Stringified (потому что он явно более удобен для чтения, чем шестнадцатеричные данные JSON). Если после ответа вы напечатаете jsonDict
, вы увидите, что структура вывода может отличаться.
Итак, как всегда, ваши основные инструменты:
Data <== data(encoding:)/init(data:encoding:) ==> String
Data <== jsonObject(with:options:)/data(withJSONObject:options:) ==> Array or Dictionary //I bypass voluntarily the specific case of String at top level
Давай сделаем это тогда!
let jsonStringifiedString = dict["message"] as String
let jsonStringifiedData = jsonStringifiedString.data(using: .utf8) as Data
let jsonDict = try JSONSerialization.jsonObject(with: jsonStringifiedData, options: []) as [String: Any]
let baseResponse = Mapper<NotificationModel>().map(JSON: jsonDict)
На вашем месте я бы посмотрел на Mapper
, если бы не было способа сделать что-то вроде:
let baseResponse = Mapper<NotificationModel>().map(JSONData: jsonStringifiedData)
или
let baseResponse = Mapper<NotificationModel>().map(JSONString: jsonStringifiedString)
Поскольку иногда в JSON встроены JSONStringified, где вам может потребоваться вызвать его на String
или Data
напрямую.
Или просто потому, что базовый запрос URLSession
возвращает объект Data
при его закрытии, и вы хотите использовать его напрямую.