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

#java #android #firebase #firebase-cloud-messaging #jsonobject

# #java #Android #firebase #firebase-облако-обмен сообщениями #jsonobject — объект

Вопрос:

через эту форму:

 {
  "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");
 

но это дает мне ошибки try catch…

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

Ответ №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;
        }

    }

}
 

Десериализуйте объект уведомления из удаленного сообщения.

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

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

Если ваши пользовательские данные json вложены в один ключ, например «data», тогда используйте:

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

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

Ответ №2:

Столкнулся с этой проблемой при переходе с 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)
 

Ответ №3:

Вот так просто:

 String linkData = remoteMessage.getData().get("link");
JSONObject linkObject = new JSONObject(linkData);

String url = linkObject.getString("url");
String text = linkObject.getString("text");
 

Конечно, вместе с правильной обработкой ошибок.