You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FCM通知JSON格式异常:Android端接收内容非标准JSON

解决FCM通知在Android端接收为非JSON格式的问题

嘿,这个问题我之前也碰到过,其实你收到的内容并不是“无效JSON”——这是FCM SDK对data字段的默认解析逻辑导致的,咱们一步步来解决:

为什么会出现这种情况?

FCM的data字段本质是键值对集合,当Android端接收到这类消息时,FCM SDK会自动把data里的内容解析成Map<String, String>,同时附带FCM的元数据(比如google.sent_time、google.message_id这些),所以你看到的是一组键值对,而不是原始的JSON字符串。

两种解决办法

办法1:调整发送端的消息格式

如果希望Android端直接拿到标准JSON字符串,可以把data里的业务内容打包成一个转义后的JSON字符串,比如修改发送的请求体:

{
  "registration_ids": [ "123456" ],
  "priority": "high",
  "data": {
    "payload": "{\"notification_type\": \"request_accepted\", \"feedback\": \"request accepted\"}"
  }
}

这样Android端拿到payload字段的值后,直接解析这个字符串就是你想要的JSON结构了。

办法2:在Android端把Map转换成JSON

如果不想改动发送端的逻辑,那就在onMessageReceived方法里,把SDK返回的Map转换成标准JSON:
比如用Gson库转换:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Map<String, String> dataMap = remoteMessage.getData();
    // 把Map转成JSON字符串
    String jsonString = new Gson().toJson(dataMap);
    // 后续就可以按正常JSON来解析处理了
}

或者用Android自带的org.json库:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Map<String, String> dataMap = remoteMessage.getData();
    JSONObject jsonObject = new JSONObject(dataMap);
    // 直接使用jsonObject操作即可
}

需要注意的是,那些google.*开头的字段是FCM自动添加的元数据,属于正常内容,如果你不需要可以在转换后过滤掉。

内容的提问来源于stack exchange,提问作者Asim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:23:08