在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消息包数据的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用 Spark Streaming 解析 JSON 消息