在javascript中解析json消息包数据

Posted

技术标签:

【中文标题】在javascript中解析json消息包数据【英文标题】:Parsing json messagepack data in javascript 【发布时间】:2015-11-02 14:56:36 【问题描述】:

我正在使用客户端上的 kawanet/msgpack-lite (javascript) 和 msgpack/msgpack-c (C++) 将 json 数据发送到带有消息包的 websocketpp 服务器来解压它,并使用 nlohmann/json 在服务器上解析它。这很好。

但由于无法正确解析返回的数据,因此我显然使用了错误的方式消息包。

服务器:

if (jdata["type"] == "msg") 
    std::stringstream buffer;
    std::string clientmsg = jdata["data"];
    jdata["cnt"] = clientmsg.length();
    msgpack::pack(buffer, jdata.dump());
    size_t plen = buffer.tellp();
    msg->set_payload(&buffer, plen);
    m_server.send(hdl, msg);

客户:

reader.onload = function (e) 
    console.log("FileReader.onload(): " + reader.result);
    var decoded_message = msgpack.decode(reader.result);

reader.readAsText(e.data);

它在 msgpack.decode() 上失败了

Uncaught Error: Invalid type: 0xh

在 set_payload() 中将 json 作为字符串发送时

msg->set_payload(jdata.dump());

传输正常

FileReader.onload(): "cnt":4,"data":"test","type":"msg"

【问题讨论】:

【参考方案1】:

std::stringstream 的地址不是指向其底层缓冲区的指针。

试试:msg->set_payload(buffer.str());

【讨论】:

我试过了,但它以明文形式发送数据,因此它似乎没有被序列化。 那是因为您正在“打包” JSON 字符串。 jdata.dump() 将您的数据序列化为 JSON 字符串。 msgpack::pack 然后打包这个字符串。真的没有什么要打包的。 msgpack 通常是你用来代替 JSON 的东西,而不是用来打包 JSON。 谢谢。 JSON 在使用 javascript 时是一种很好的格式,但对于 C++ 可能不是那么理想。我已经搜索了在 javascript 和 C++ 之间序列化数据的方法,messagepack 看起来像是首选的方法。也许我应该寻找一个模仿 C++ 中 unordered_map 的 javascript 库。【参考方案2】:

如果有帮助:nlohmann/json 现在支持 MessagePack(和 CBOR),因此您现在可以完全使用 nlohmann/json 实现您的场景。有关示例,请参阅https://github.com/nlohmann/json#binary-formats-cbor-and-messagepack。

【讨论】:

请不要对多个问题发布相同的答案。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,调整您对该问题的回答。

以上是关于在javascript中解析json消息包数据的主要内容,如果未能解决你的问题,请参考以下文章

数据以 JSON 对象的形式传入,如何解析?

在 Python 中使用 Spark Streaming 解析 JSON 消息

从 JSON 文件解析可翻译的消息

JavaScript中解析JSON数据

如何在不解析的情况下在javascript中同步包含JSON数据?

JSON Javascript,解析 URL [重复]