C++ JSON反序列化器

10
我们可以使用C++项目,需要将对象从json串中进行序列化和反序列化。在C#中,我们使用JSON.NET。我们只需调用:

We can C++ project and we need to (de) serialize objects from and into json.

In C# we are using JSON.NET. We simple call:


string json = JsonConvert.SerializeObject(product);
var myNewObject = JsonConvert.DeserializeObject<MyClass>(json);

非常简单和有用。

是否有人知道免费的C++库,可以像在C#中那样简单地使用它?

我们正在使用JsonCpp,但它不支持此功能。

非常感谢 问候


查找 Janson 库,它提供了一些非常有用的 C++ API。 - Kam
1
如果你特别想要 c++,请不要为 c 添加标签。它们不是同一种语言。 - Samidamaru
SimpleJSON库对我来说很有效。 - Jabberwocky
你使用过 search 吗? - Ivan Aksamentov - Drop
3个回答

9

C++不支持反射,因此您必须为每个对象编写自己的序列化和反序列化函数。


4
坦白说,C#的Newtonsoft.JsonConvert库提供了令人难以置信的便利和易用性,这表明我们为什么需要C++中的反射。幸运的是,我们可能会在某个时候获得C++的编译时反射。标准委员会已经成立了一个名为“SG7 Reflection”的研究小组来达成此目的。 - petke

3
我正在使用https://github.com/nlohmann/json在C++ websocket服务器中与html/javascript客户端通信。websocket框架是https://github.com/zaphoyd/websocketpp。因此,从服务器发送json结构“matches”的方法如下:
msg->set_payload(matches.dump());
m_server.send(hdl, msg);

从客户端同样如此。
var m = "la_liga";
var msg = {
    "type": "request",
    "data": m
}
msg = JSON.stringify(msg);
ws.send(msg);

在服务器端接收到JSON后,我会对其进行解析,并使用try-catch语句进行处理。
void on_message(connection_hdl hdl, server::message_ptr msg) {
    connection_ptr con = m_server.get_con_from_hdl(hdl);

    nlohmann::json jdata;

    std::string payload = msg->get_payload();
    try {
        jdata.clear();
        jdata = nlohmann::json::parse(payload);
        if (jdata["type"] == "update") {
            <do something with this json structure>
        }
    } catch (const std::exception& e) {
        msg->set_payload("Unable to parse json");
        m_server.send(hdl, msg);
        std::cerr << "Unable to parse json: " << e.what() << std::endl;
    }
}

同样地,在客户端上也是如此

ws.onmessage = function (e) {
    var receivedMsg = JSON.parse(e.data);

    if (receivedMsg.type == "table") {
        <sort and display updated table standing>
    }
}

Websocketpp需要使用boost库。


1

由于找不到符合我的需求的非boost序列化器,我编写了这个C++序列化器/反序列化器:

Pakal Persist

它支持JSON和XML以及多态对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接