C++14下使用Boost.JSON处理JSON数组:如何获取其中对象并判断currentYear字段值?
解决Boost.JSON获取数组内对象并判断字段的问题
嘿,我看到你遇到的问题了——其实核心是你没注意到原始的JSON数据是一个数组(用[]包裹),而不是直接的对象,所以直接调用get_object()肯定拿不到想要的内容。咱们一步步来修正代码:
步骤拆解
- 首先确认JSON解析成功,检查
error_code - 将解析后的
value转换为数组类型(因为原始JSON是数组) - 从数组中取出第三个元素(索引为2,数组下标从0开始),这个元素才是你需要的对象
- 将该元素转换为
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
相关产品推荐
相关产品推荐

