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

Android端接收FCM Data payload非JSON格式,需JSON解析处理

处理Firebase RemoteMessage中的自定义键值对格式数据

嘿,我来帮你搞定这个问题!首先得澄清一个误区:你看到的Data Payload:{image=https://www.xxxx.xxx/get-profile-picture, message=This is a test message., senderName=Mathew John}并不是什么特殊的自定义格式——它其实是Firebase的remoteMessage.getData()返回的Map<String, String>对象调用toString()后的输出结果。Firebase已经帮你把数据解析成键值对Map了,根本不需要再手动做JSON解析!

最优解决方案:直接使用解析好的Map

这是最简单也最可靠的方式,直接用Firebase提供的Map来获取数据:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    if (remoteMessage.getData().size() > 0) {
        // 直接拿到Firebase已经解析好的键值对Map
        Map<String, String> dataMap = remoteMessage.getData();
        
        // 根据键直接取值,不用处理任何字符串格式
        String imageUrl = dataMap.get("image");
        String messageContent = dataMap.get("message");
        String senderName = dataMap.get("senderName");
        
        // 打印或者使用这些数据
        Log.e(TAG, "获取到的图片URL: " + imageUrl);
        Log.e(TAG, "消息内容: " + messageContent);
        Log.e(TAG, "发送者名称: " + senderName);
        
        // 这里可以写你的后续业务逻辑,比如显示通知、更新UI等
    }
}

特殊场景:手动将字符串转为JSON(不推荐)

如果因为某些特殊需求,你必须处理那个toString()输出的字符串,那可以手动把它转换成标准JSON格式再解析。注意:这种方式容易因为值里的特殊字符(比如逗号、空格)出问题,仅在万不得已时使用:

// 假设你已经拿到了那个原始字符串
String rawPayload = "Data Payload:{image=https://www.xxxx.xxx/get-profile-picture, message=This is a test message., senderName=Mathew John}";

// 第一步:移除开头的"Data Payload:"前缀
String payloadContent = rawPayload.replace("Data Payload:", "");

// 第二步:将自定义格式转换为标准JSON格式
String jsonString = payloadContent
        // 给键和值加上双引号,替换=为:
        .replaceAll("(\\w+)=([^,]+)", "\"$1\":\"$2\"")
        // 替换逗号加空格为","
        .replace(", ", "\", \"")
        // 处理首尾的大括号,补全双引号
        .replace("{", "{\"")
        .replace("}", "\"}");

// 现在可以用JSON库解析了,比如org.json或者Gson
try {
    JSONObject jsonObject = new JSONObject(jsonString);
    String image = jsonObject.getString("image");
    String message = jsonObject.getString("message");
    String senderName = jsonObject.getString("senderName");
    
    // 处理解析后的数据
} catch (JSONException e) {
    e.printStackTrace();
    // 格式转换失败时的异常处理
}

再次强调:优先使用第一种方法,直接操作Firebase返回的Map,这是官方推荐的方式,既高效又避免了手动解析字符串可能带来的各种问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:31:27