nlohmann/json uWebsocket

Posted

技术标签:

【中文标题】nlohmann/json uWebsocket【英文标题】: 【发布时间】:2018-09-25 18:00:40 【问题描述】:

对于一个项目,我想将uNetworking/uWebSockets 库与nlohmann/json 库结合使用。

这是我目前的代码:

#include <uWS/uWS.h>
using namespace uWS;
using json = nlohmann::json;

int main() 
    Hub h;

    h.onMessage([](WebSocket<SERVER> *ws, char *message, size_t length, OpCode opCode) 
        json parsed = json::parse(message);
        ws->send(message, length, opCode);
    );

    if (h.listen(3000)) 
        h.run();
    

解析消息时出现此错误(经过验证的 json):

libc++abi.dylib: terminating with unexpected exception of type nlohmann::detail::parse_error: [json.exception.parse_error.101] parse error at 37: syntax error - invalid literal; last read: '" \"happy\": true, \"pi\": 3.141 "o'; expected end of input

到目前为止,我被困住了。

提前致谢。

西奥

【问题讨论】:

这是一个开始,但我们无法仅用这段代码重现问题。 @tadman 我编辑了代码 @TheoBouwman 您如何将消息发送到此应用程序?如果有一个 bash 命令我们可以剪切和粘贴以生成相同的消息,那就太好了。查看错误消息&gt;`'" \"happy\": true, \"pi\": 3.141 "o'&lt; 似乎该消息中有一些额外的字符使其不是JSON。我会添加代码以打印出每个字符(及其 ASCII 代码),以查看您在消息中得到了哪些字符。 【参考方案1】:

我找不到uWebSockets 的任何文档,但大概是因为onMessage 有一个length 参数message 不一定是空终止的。因此,您需要这样做:

json parsed = json::parse(message, length);

【讨论】:

@TheoBouwman 没有编译?坠毁?有和以前一样的问题吗?你试过调试吗?【参考方案2】:

你似乎在解析

" \"happy\": true, \"pi\": 3.141 "o

有几个问题:

JSON 对象周围的引号似乎是无意的 - 结果将是字符串而不是对象 字符串后面的o 是意外的,因此出现错误消息;注意 o 是读取的第 37 个字符,因此 parse error at 37

【讨论】:

以上是关于nlohmann/json uWebsocket的主要内容,如果未能解决你的问题,请参考以下文章

nlohmann/json uWebsocket

C++ nlohmann/json 如何使用运行时提供的 json_pointers 来读取 json 值

nlohmann::json::dump()函数(将JSON对象序列化为字符串)

nlohmann json for modern C++

C++ nlohmann/json 的主要用法

c++11:nlohmann::json进阶使用应用adl_serializer解决第三方数据类型(such as uri)的序列化和反序列化