#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");
Конечно, вместе с правильной обработкой ошибок.