当前位置: 首页 > 知识库问答 >
问题:

如何确保WebSocket消息是JSON字符串,防止JSON.parse错误?

田骁
2023-03-14

我已经四处寻找了一种合适的方法来捕获或防止无效的json.parse调用,特别是在WebSocket消息的情况下,因为它的性能受到影响而不涉及type/catch块。

我几乎完全将RESTful API转换为使用JSON进行通信的纯WebSocket API。唯一的问题是,当通过onmessage函数输入一个格式错误的消息字符串时,我不知道如何防止json.parse停止应用程序。从服务器发送的所有消息都是理论上正确的JSON,已经被stringied了,所以问题是,这是一个需要担心的边缘情况吗?因为用于从服务器端JSON发送数据的函数在发送之前执行。

我正在使用reactredux以及redux-thunk来打开WebSocket并添加事件侦听器,因此在一条消息上运行下面的函数。

function onMessage(msg) {
  const data = JSON.parse(msg.data);
  return {
    type: data.type,
    data: data.data
  }
}

当然,如果msg不是有效的JSON字符串,则会中断应用程序的执行。

因此,如果没有try/catch块,是否是(以某种方式)确保发送有效的JSON的唯一选项?或者这是一个我不该担心的边缘案件。

对于客户端来说,这可能不是一个大问题,因为所有消息都来自一个集中的点(服务器),但另一方面,对于服务器来说,这是一个很大的问题,因为它有可能接收到未从应用程序发送的消息。

try/catch真的是想象中的魔鬼吗?因为我唯一能想到的就是创建一个regex检查,这本身就会变得相当复杂。

共有1个答案

谢清野
2023-03-14

不要因为type/catch块的性能受到影响而涉及它。

忘掉那些神话吧。您希望捕获异常,如json.parse中的异常,您可以使用try/catch块。这是一个简单的,并不是一个重大的性能打击。当然,您也可以编写自己的逻辑来验证JSON字符串(不使用regex!),但这将是一个完整的解析器,它只是不使用异常来发出格式错误的输入信号--而且比本机函数慢得多。

这是一个需要担心的边缘案件吗?

 类似资料:
  • 我有一根生弦。我只是想验证这个字符串是否是有效的JSON。我正在使用JSON. NET。

  • 问题内容: 有谁知道PHP的健壮(和防弹)is_JSON函数代码片段?我(显然)遇到一种情况,我需要知道字符串是否为JSON。 嗯,也许通过JSONLint请求/响应来运行它,但这似乎有点过头了。 问题答案: 如果您使用内置的PHP函数,则 返回最后一个错误(例如, 当您的字符串不是JSON时)。 无论如何通常都会返回。

  • 问题内容: 传递0作为限制参数可以防止尾随空字符串,但是如何防止 前导 空字符串呢? 例如 结果是带有“”,“ Test”,“ Stuff”的数组。 是的,我知道我可以滚动自己的令牌生成器…但是StringTokenizer的API文档说 “ StringTokenizer是一个遗留类,出于兼容性原因保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用拆分” 问题答案: 您最好的选择可能

  • 问题内容: 我收到此错误: JSON.parse:意外字符 当我在firebug中运行以下语句时: 为什么会这样呢?JSON字符串对我来说似乎是正确的,我也使用JSHint对其进行了测试。在上述情况下,传递的对象是服务器响应,其内容类型设置为 问题答案: 您不是在解析字符串,而是在解析一个已经解析的对象:)

  • 问题内容: 有没有办法避免返回包含无效(非UTF-8)字符的字符串? 在复杂的系统中调试可能会很麻烦。实际看到无效字符,或者至少将其省略会更合适。就目前而言,它将无声地丢弃整个字符串。 示例(在UTF-8中): 结果是 所需结果: 注意 :我 不 希望使破碎的字符串在json_encode()中起作用。我正在寻找简化诊断编码错误的方法。一个字符串是不是该有所帮助。 问题答案: php确实会尝试产生

  • 问题内容: JSON.stringify显然不是非常节省空间。例如,当[123456789,123456789]可能需要大约5个字节时,它将占用20+字节。websocket是否在发送到流之前压缩其JSON? 问题答案: 从本质上讲,WebSocket只是用于TEXT或BINARY数据的一组框架。 它本身不执行压缩。 但是,WebSocket规范允许扩展,并且野外有各种各样的压缩扩展(其中一项的正