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

C++14下使用Boost.JSON处理JSON数组:如何获取其中对象并判断currentYear字段值?

解决Boost.JSON获取数组内对象并判断字段的问题

嘿,我看到你遇到的问题了——其实核心是你没注意到原始的JSON数据是一个数组(用[]包裹),而不是直接的对象,所以直接调用get_object()肯定拿不到想要的内容。咱们一步步来修正代码:

步骤拆解

  1. 首先确认JSON解析成功,检查error_code
  2. 将解析后的value转换为数组类型(因为原始JSON是数组)
  3. 从数组中取出第三个元素(索引为2,数组下标从0开始),这个元素才是你需要的对象
  4. 将该元素转换为object类型,之后就可以访问currentYear字段做判断了

完整示例代码

#include <boost/json.hpp>
#include <iostream>

using namespace boost::json;

int main() {
    const std::string data = R"([10, "Session" , {"currentYear":"2048","accidents":10,"status":"Accepted"}])";
    
    value testVal;
    error_code ec;
    testVal = parse(data, ec);

    // 先检查解析是否成功
    if (ec) {
        std::cerr << "JSON解析失败: " << ec.message() << std::endl;
        return 1;
    }

    // 确认解析结果是数组
    if (!testVal.is_array()) {
        std::cerr << "JSON不是数组类型" << std::endl;
        return 1;
    }

    array testArr = testVal.get_array();
    // 检查数组是否有至少3个元素(索引0、1、2)
    if (testArr.size() < 3) {
        std::cerr << "数组元素数量不足" << std::endl;
        return 1;
    }

    // 取出第三个元素,确认它是对象类型
    value& objVal = testArr[2];
    if (!objVal.is_object()) {
        std::cerr << "目标元素不是对象类型" << std::endl;
        return 1;
    }

    object testObj = objVal.get_object();
    // 检查currentYear字段是否存在,再做判断
    auto it = testObj.find("currentYear");
    if (it != testObj.end() && it->value() == "2048") {
        std::cout << "currentYear是2048,执行对应逻辑" << std::endl;
        // 这里写你的处理逻辑
    } else {
        std::cout << "currentYear不是2048或字段不存在" << std::endl;
    }

    return 0;
}

额外说明

  • 对于嵌入式开发场景,建议尽量加上类型检查和边界判断,避免因JSON格式异常导致程序崩溃
  • 如果不想写太多判断,也可以用as_object()、as_array()这些方法,但它们在类型不匹配时会抛出异常,需要用try-catch捕获(不过嵌入式环境可能不太推荐异常,所以上面的示例用了更安全的is_xxx()判断)

内容的提问来源于stack exchange,提问作者Wojtkingson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:08:10