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

