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
相关产品推荐
相关产品推荐

