升级pusher.com库后收到等号分隔JSON,是否合规及如何解析
格式合法性判定
你收到的内容不是合法JSON格式。
标准JSON规范明确要求:
- 键名必须用双引号包裹
- 键和值之间必须用冒号
:分隔 - 字符串值必须用双引号包裹
你收到的内容本质是.NET对象调用ToString()方法后的调试输出格式,不是服务端返回的原始数据。
问题根因
这是升级后的Pusher .NET客户端库的API行为变更导致的:
- 旧版库回调时返回的是服务端下发的原始JSON字符串,你直接打印就会显示标准JSON
- 新版库默认会自动将服务端下发的JSON解析为结构化事件对象,你直接对事件对象调用
ToString()或者直接打印时,输出的就是对象的调试字符串,也就是你现在看到的用=分隔键值、顶级键无引号的格式
服务端完全没有改动,不需要排查服务端逻辑。
解决方案
优先方案:直接使用库提供的结构化属性
新版库已经帮你完成了反序列化操作,不需要你自己再做JSON解析,直接取事件对象的对应属性即可:
// 假设你事件回调的参数名为pusherEvent // 直接取对应属性即可,无需反序列化 string eventName = pusherEvent.Event; string channelName = pusherEvent.Channel; string userId = pusherEvent.UserId; // Data字段是服务端下发的data段原始JSON,可按需解析 JObject messageData = JObject.Parse(pusherEvent.Data);
备选方案:获取原始JSON自行解析
如果你的业务逻辑需要用到完整的原始JSON字符串,可以直接调用事件对象的原始数据属性(不同版本库的属性名可能为Raw/RawData/OriginalJson,可查看当前使用的Pusher库版本的对象定义确认):
string rawJson = pusherEvent.Raw; // 拿到的rawJson就是和旧版一致的标准JSON,可以正常反序列化 var fullEvent = JsonConvert.DeserializeObject<YourEventModel>(rawJson);
不推荐的兼容方案:手动转换格式
如果实在无法获取原始属性,才考虑用字符串替换的方式把当前格式转换为合法JSON,该方案容错性低,仅做应急使用:
// 仅应急使用,优先用上面两种方案 string invalidFormatStr = yourCurrentString; // 替换=为: var jsonStr = invalidFormatStr.Replace(" = ", ": "); // 给顶级无引号的键加双引号(正则匹配处理) jsonStr = Regex.Replace(jsonStr, @"([\w_]+)(?=\s*:)", "\"$1\""); // 处理空值的user_id jsonStr = jsonStr.Replace("user_id: ", "user_id: \"\""); // 再做反序列化 var result = JsonConvert.DeserializeObject<YourModel>(jsonStr);
内容的提问来源于stack exchange,提问作者FiddlingAway
相关产品推荐
相关产品推荐

