Извлечение данных из вложенного JSON в FireMase RemoteMessage - PullRequest
0 голосов
/ 06 марта 2019

Я разрабатываю приложение для обмена сообщениями в Swift.Я настроил Firebase Cloud Messaging, и он работает, данные поступают на мой телефон.

func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
    print(remoteMessage.appData)
}

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

[AnyHashable("message"): {"chat":{"msg":"hey","file":null,"to":"username","date":"2019\/03\/06 08:17:42","group":"TESTING","from":"User Real Name","res":"1"}}, AnyHashable("from"): 123123123]

Я пытался прочитать его как JSON, но он не работает.

let data = try? JSONSerialization.data(withJSONObject: remoteMessage.appData["message"]
if let messageJSON = try? JSONSerialization.jsonObject(with: data!) as? [String : Any] {
    print(messageJSON
    if let chatJSON = messageJSON["chat"] as? [String : Any] {
        print(chatJSON)
    }
}

Это дает мне этоошибка в первой строке.

* Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «* + [NSJSONSerialziation dataWithJSONObject: options: error:]: недопустимая top-тип уровня в JSON напишите '

Я следовал советам по этой записи, но тоже не повезло.

let d: [String : Any] = remoteMessage.appData["message"] as! [String : Any]
let body: [String : Any] = d["chat"] as! [String : Any]
let msg: String = body["msg"] as! String
print(msg)

Невозможно привести значениетипа «__NSCFString» (0x1e0e52f90) в «NSDictionary» (0x1e0e53bc0).

1 Ответ

1 голос
/ 06 марта 2019

Вам нужно

do {
  let d  = remoteMessage.appData["message"] as! String
  let res = try JSONDecoder().decode(Root.self,from:Data(d.utf8)) 
  print(res)
}
catch {
 print(error)
}

struct Root: Codable {
    let chat: Chat
}

struct Chat: Codable {
    let msg: String
    let file: String?
    let to, date, group, from: String
    let res: String
}

как ключ message содержит строку json, а не словарь

...