如何用Boost.JSON将input.json中Identifier2的metrics转为二维int向量
解决Boost JSON读取指定字段并转换为二维vector的问题
原代码的核心问题
- 读取文件方式错误:
value_from("input.json")是将C++对象序列化为JSON值的接口,并非读取文件的方法。需要先读取文件内容,再用boost::json::parse解析成JSON对象。 - 未定位目标字段:直接对整个JSON根对象使用
value_to,无法匹配到Identifier2下的metrics字段,必须逐层访问目标节点。
修正后的完整代码
#include <boost/json.hpp> #include <vector> #include <fstream> #include <string> #include <iostream> using namespace boost::json; int main() { // 1. 读取JSON文件内容到字符串 std::ifstream ifs("input.json"); std::string json_str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); // 2. 解析字符串为JSON value对象 value jv = parse(json_str); // 3. 逐层定位到Identifier2下的metrics数组 array const& metrics_json = jv.as_object()["Identifier2"].as_object()["metrics"].as_array(); // 4. 将JSON数组转换为std::vector<std::vector<int>> std::vector<std::vector<int>> metrics = value_to<std::vector<std::vector<int>>>(metrics_json); // 验证转换结果(可选) for (auto const& row : metrics) { for (int num : row) { std::cout << num << " "; } std::cout << "\n"; } return 0; }
关键步骤说明
- 文件读取:通过
std::ifstream将文件内容读取到字符串,这是JSON解析的前置步骤。 - JSON解析:
parse函数负责将字符串格式的JSON转换为boost::json::value对象,后续可通过类型转换方法访问内部节点。 - 字段定位:
jv.as_object():将根JSON值转换为对象(因为输入的JSON根结构是对象)。["Identifier2"]:通过键名获取对应的子对象。["metrics"].as_array():获取metrics对应的JSON数组节点。
- 类型转换:Boost JSON原生支持将JSON数组转换为
std::vector这类标准容器,value_to<T>会自动完成嵌套数组到二维vector的转换。
安全访问的补充方案
如果不确定目标字段是否存在,可使用object::find避免键不存在导致的异常:
auto const& root_obj = jv.as_object(); auto id2_it = root_obj.find("Identifier2"); if (id2_it != root_obj.end()) { auto const& id2_obj = id2_it->value().as_object(); auto metrics_it = id2_obj.find("metrics"); if (metrics_it != id2_obj.end()) { std::vector<std::vector<int>> metrics = value_to<std::vector<std::vector<int>>>(metrics_it->value()); // 后续业务处理 } }
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

