将 json 对象转换为 c++ 对象
Converting json object to c++ object
我使用 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;
}
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象