【问题标题】:Parsing json messagepack data in javascript在javascript中解析json消息包数据
【发布时间】: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"}

【问题讨论】:

    标签: javascript c++ json websocket messagepack


    【解决方案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

    【讨论】:

    • 请不要对多个问题发布相同的答案。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,调整您对该问题的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2016-03-19
    • 2012-06-05
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多