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

Flutter中Pusher API返回JSON数据解码失败,求可行解决方案

Flutter Pusher 事件数据解码失败解决方案

根因说明

Pusher 事件回调中的 event.data 默认为已解析完成的 Dart Map 类型,不是未解码的 JSON 字符串。jsonDecode() 仅支持输入合法 JSON 格式字符串,传入非字符串类型会直接抛出格式异常。

可用解决方案

方案1:直接使用原始数据(推荐,适配99%场景)

直接去掉 jsonDecode() 调用,直接使用 event.data 即可,示例代码如下:

Future<void> _initPusher() async{
  PusherClient pusher;
  Channel channel;
  pusher = PusherClient(
    "adb844af65547f4a67cf",
    PusherOptions(
      cluster: "mt1",
    ),
    enableLogging: true,
  );

  channel = pusher.subscribe("my-channel-chat");

  pusher.onConnectionError((error) {
    print("error: ${error!.message}");
  });

  channel.bind('my-event-chat', (event) {
    // 直接取值即可,不需要解码
    final Map<String, dynamic> data = event?.data as Map<String, dynamic>;
    print(data);
    // 后续可直接通过键名取值,例:data['user_name']
  });
}

方案2:转义后解码(仅适配服务端推送转义后JSON字符串的场景)

如果打印 event.data.runtimeType 确认返回为字符串类型,且字符串带多余转义符,可先处理转义再解码:

channel.bind('my-event-chat', (event) {
  String rawData = event!.data.toString();
  // 移除多余转义符与首尾冗余引号
  rawData = rawData.replaceAll(r'\', '').trim();
  if (rawData.startsWith('"')) rawData = rawData.substring(1);
  if (rawData.endsWith('"')) rawData = rawData.substring(0, rawData.length - 1);
  final data = jsonDecode(rawData);
  print(data);
});

前置验证方法

可在回调中先添加一行代码确认数据类型,再选择对应方案:
print("event.data类型:${event?.data.runtimeType}");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:39:02