0

с помощью этой формы:Firebase Android: как мне получить доступ к параметрам, вложенным в данные через RemoteMessage?

{ 
    "to": "000", 
    "priority": "high", 
    "data": { 
    "title": "A Title", 
    "message": "A Message", 
    "link": { 
     "url": "http://www.espn.com", 
     "text": "ESPN", 
    } 
    } 
} 

, как я могу получить доступ "URL" и "текст"?

String messageLink = remoteMessage.getData().get("link"); 

получает меня:

{"text":"ESPN","url":"http://www.espn.com"} 

, но как я сверлить глубже?

remoteMessage.getData().get("link").get("text"); 

оленья кожа довольно работа ... Я также попытался JSONObject:

JSONObject json = new JSONObject(remoteMessage.getData());  
JSONObject link = json.getJSONObject("link"); 

, но это дает мне попробовать отлавливать ошибки ...

Любая помощь и направление, как всегда высоко ценится!

ответ

1

Я бы использовал gson и определил класс модели. Удаленное сообщение дает вам Map<String, String>, и их нет соответствующего конструктора для создания объекта json.

Добавить gson в свой build.xml:

compile 'com.google.code.gson:gson:2.5' 

Создание модели уведомления:

import com.google.gson.annotations.SerializedName; 

public class Notification { 

    @SerializedName("title") 
    String title; 
    @SerializedName("message") 
    String message; 
    @SerializedName("link") 
    private Link link; 

    public String getTitle() { 
     return title; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public Link getLink() { 
     return link; 
    } 

    public class Link { 

     @SerializedName("url") 
     String url; 
     @SerializedName("text") 
     String text; 

     public String getUrl() { 
      return url; 
     } 

     public String getText() { 
      return text; 
     } 

    } 

} 

Deserialize объект уведомления от удаленного сообщения.

Если все пользовательские ключи находятся на верхнем уровне:

Notification notification = gson.fromJson(gson.toJson(remoteMessage.getData()), Notification.class); 

Если данные пользовательских JSON вложен в одном ключе, например, «данные», а затем использовать:

Notification notification = gson.fromJson(remoteMessage.getData().get("data"), Notification.class); 

Примечание в этот простой случай аннотации @SerializedName() не нужны, поскольку имена полей точно соответствуют ключам в json, но если вы, например, имеете ключевое имя start_time, но вы хотите назвать поле java startTime, вам понадобится аннотация.

0

Столкнувшись с проблемой при переходе с GCM на FCM.

Следующее работает для моего варианта использования, поэтому, возможно, это сработает для вас.

JsonObject jsonObject = new JsonObject(); // com.google.gson.JsonObject 
JsonParser jsonParser = new JsonParser(); // com.google.gson.JsonParser 
Map<String, String> map = remoteMessage.getData(); 
String val; 

for (String key : map.keySet()) { 
    val = map.get(key); 
    try { 
     jsonObject.add(key, jsonParser.parse(val)); 
    } catch (Exception e) { 
     jsonObject.addProperty(key, val); 
    } 
} 

// Now you can traverse jsonObject, or use to populate a custom object: 
// MyObj o = new Gson().fromJson(jsonObject, MyObj.class) 
Смежные вопросы