【问题标题】:socket.io - is JSON a must to send an objectsocket.io - 发送对象必须使用 JSON
【发布时间】:2013-05-16 16:34:15
【问题描述】:

我在前端有一个对象,我想将它广播给所有连接的客户端。我可以按照我定义的方式将它作为一个单纯的对象发送吗?还是我总是必须在发送之前将其字符串化为 JSON 对象?

我的对象:

var myBox = {
         x: 400,
         y: 700,
         w: 231,
         h: 199,
         c: "red",
         ....
         }

我需要字符串化吗?

var myBox  = JSON.stringify({

            x: 400,
            y: 700,
            ...
        });

目前我是这样发送的,而且消息是 JSON:

socket.emit('message', msg);

【问题讨论】:

  • 你是如何“发送”它的?
  • 谁知道...你没有给我们提供足够的信息来帮助你。
  • 对不起,我添加了一些信息。目前我这样发送:socket.emit('message', msg);
  • @poppel,为什么不简单地查看文档? socket.io/#how-to-use ...他们有很多将对象作为事件数据传递的示例。

标签: javascript json node.js


【解决方案1】:

您可以将对象传递给emit,而无需自己对其进行字符串化。它将以明文形式发送,但客户端回调将传递一个已解析的对象。

换句话说,这样做很好:

var myBox = {     
    x: 400,
    y: 700,
    w: 231,
    h: 199,
    c: "red"
}

socket.emit('message', myBox);

在客户端监听的时候不用担心JSON.parse

socket.on('message', function (data) {
    alert(data.x);
});

【讨论】:

  • 对不起,我是初学者,你说的“客户端回调将传递一个解析的对象”是什么意思?
【解决方案2】:

是的,要发送一个对象,您需要将它序列化为一个字符串(准确地说是 ArrayBuffer)——一些位序列通过网络传输(在 HTTP/WS 的底层)。

然而,序列化不一定是JSON.stringify,它也可以是其他任何东西。

根据我在their docs 中读到的内容,Socket.io 具有“自动 JSON 编码/解码”,因此它会为您调用 JSON.stringify,接受普通对象作为 @987654325 的参数@也一样。

【讨论】:

  • thanx,那么你将如何序列化上面的对象?
  • 虽然Bergi 是正确的,它没有必须 是JSON……它确实应该是。 JSON 是一种广泛使用的符号,用于序列化对象,其中有许多可用于序列化和反序列化的库。无需在这里重新发明轮子。
  • 只要接收端知道如何反序列化,就可以序列化为任何格式。如果双方都是 JavaScript,JSON 确实是最好的选择。
  • @poppel:上面的对象? JSON。但有时其他格式可能更合适,您只想发送纯字符串或其他内容。
  • @Bergi,有 2 个相互矛盾的答案……您是说您明确需要序列化对象,而其他一些人则说在传递对象时会自动进行序列化。从我在socket.io/#how-to-use 上可以看到,他们直接传递对象引用。
【解决方案3】:

您可以使用来自对象的数据执行 socket.emit。

像这样:

socket.emit("message",{x:myBox.x,y:myBox.y, w:myBox.w, h:myBox.h, c:myBox.c});

或尝试:

socket.emit("message",myBox); //haven't tested it, but if it works, give plalx credit

【讨论】:

  • 内联创建对象是完全没有必要和误导性的。您所说的方式向 OP 建议需要内联定义对象,但事实并非如此。
  • 这不是不必要或误导。对于接收该信息的客户端,如果他想获取数据属性,则很简单: socket.on("message", function(data){console.log(data.x);console.log(data .y);console.log(data.w);});这种方式很容易理解。
  • 你误会我了。我的意思是你可以简单地做socket.emit('message', myBox); 不需要创建一个复制第一个结构的内联对象。
  • 我以前没有这样测试过,但你可能是对的。
猜你喜欢
  • 2013-10-26
  • 2020-12-18
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
相关资源
最近更新 更多