You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:33:13