通过这个形状:
{
"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");
但这让我尝试捕捉错误......
我们非常感谢任何帮助和指导!
答案 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");
当然,还有适当的错误处理。