Firebase Android:如何通过RemoteMessage访问嵌套在数据中的params?

时间:2016-10-14 17:57:46

标签: java android firebase firebase-cloud-messaging 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");

但这让我尝试捕捉错误......

我们非常感谢任何帮助和指导!

3 个答案:

答案 0 :(得分:2)

我会使用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您需要注释。

答案 1 :(得分:0)

从GCM迁移到FCM时遇到此问题。

以下内容适用于我的用例,因此它可能对您有用。

<canvas></canvas>

答案 2 :(得分:0)

就这么简单:

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

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

当然,还有适当的错误处理。