如何使用msgpack-c C++接口从msgpack::map中提取值
解决msgpack-c C++接口提取map中"status"值的问题
你原来的代码无法编译是因为*obj.via.map.ptr只是map里的第一个键值对,并非可通过[]索引的map结构。要提取键为"status"的整数值,需要遍历msgpack map的键值对数组,找到对应键后转换类型。
正确实现代码如下:
msgpack::object_handle oh = msgpack::unpack(rbb_buf, bytes_recvd); msgpack::object obj = oh.get(); if (obj.type == msgpack::type::MAP) { msgpack::object_map map = obj.via.map; int status = 0; // 默认值,可根据需求调整 for (std::size_t i = 0; i < map.size; ++i) { const msgpack::object_kv& kv = map.ptr[i]; // 先检查键是否为字符串类型,避免类型转换异常 if (kv.key.type == msgpack::type::STR) { std::string key = kv.key.as<std::string>(); if (key == "status") { // 检查值是否为整数类型,再转换 if (kv.value.type == msgpack::type::POSITIVE_INTEGER || kv.value.type == msgpack::type::NEGATIVE_INTEGER) { status = kv.value.as<int>(); break; } } } } // 这里可以使用获取到的status变量 }
关键说明:
msgpack::object_map包含两个成员:ptr(指向msgpack::object_kv类型的数组,每个元素是键值对)和size(map的元素个数)。- 必须先检查键和值的类型,直接调用
as<T>()如果类型不匹配会抛出异常,添加类型检查能提升代码健壮性。 - 如果你的项目使用C++11及以上标准,也可以用范围for循环遍历数组:
for (auto& kv : std::span(map.ptr, map.size)) { // 逻辑同上 }
内容的提问来源于stack exchange,提问作者evadeflow
相关产品推荐
相关产品推荐

