将 json 对象转换为 c++ 对象

Converting json object to c++ object

本文关键字:对象 c++ 转换 json      更新时间:2023-10-16

我使用 http 将 json 对象从 python 发送到 c++ 程序,在本例中,对象是这样构建的:

{
"id":1,
"parameters":{
              "var1":"bla",
              "var2":7,
              "var3":/* base64 encoded binary data */
             }
}

c ++代码知道,如果"id" == 1那么我们有三个参数,第一个是std::string第二个是int,第三个是vector<unsigned char>。(或char[],int,unsigned char[](

如果id不同,则发送不同的变量类型。每个id对应于具有不同变量类型的不同C++类。

我想我应该发送一个结构,其中包含来自 json 的所有参数值,如下所示:

{
 char var1[MAX_SIZE];
 int var2;
 unsigned char var3[MAX_SIZE];
}

结构字节数组将以 base64 编码,但我不想限制使用 MAX_SIZE 发送的数据

如果我想将 json 中的每个值"强制转换"到 c++ 可以使用的对象,在这种情况下可以使用哪些方法/设计?

下面是如何从接收的json数据中提取所需信息的示例。它使用以下json解析器:jsoncpp。

请注意,字符串数据和解码的二进制数据都存储在std::string对象中。

#include <string>
#include <json/json.h>
std::string json_data = R"~(
{
    "id": 1,
    "parameters":
    {
        "var1": "bla",
        "var2": 7,
        "var3": "base64 encoded binary data"
    }
}
)~";
struct parameters_1
{
    std::string var1; // store text here
    int var2;
    std::string var3; // store binary data here
};
std::string base64decode(const std::string& data)
{
    // function to decode base64 data into binary
    return {"decoded data"};
}
parameters_1 parse_1(const Json::Value& parameters)
{
    parameters_1 p;
    p.var1 = parameters.get("var1", Json::nullValue).asString();
    p.var2 = parameters.get("var2", Json::nullValue).asInt();
    p.var3 = base64decode(parameters.get("var3", Json::nullValue).asString());
    return p;
}
int main()
{
    // this is our json document
    Json::Value json;
    Json::Reader reader;
    reader.parse(json_data, json, false);
    Json::Value id = json.get("id", Json::nullValue);
    switch(id.asInt())
    {
        case 1:
        {
            parameters_1 p = parse_1(json.get("parameters", Json::nullValue));
            std::cout << "var1: " << p.var1 << 'n';
            std::cout << "var2: " << p.var2 << 'n';
            std::cout << "var3: " << p.var3 << 'n';
        }
        break;
        default:
            std::cerr << "ERROR: Bad parameter type: " << id.asInt() << 'n';
        break;
    }
}