如何用C++的JsonCpp遍历未知键的JSON集合并提取键名
解决JsonCpp提取JSON键名及转std::map的问题
直接提取JSON对象的键名(无需转map)
JsonCpp本身提供了直接获取键名列表的方法,不需要将Json::Value强制转为std::map——这也是最简洁的解决方案。
当你解析得到的Json::Value是一个对象类型(对应JSON中的{}结构)时,可以调用getMemberNames()方法,它会返回一个std::vector<std::string>,包含该对象的所有键名。
代码示例
#include <json/json.h> #include <fstream> #include <vector> #include <iostream> int main() { // 读取并解析JSON文件 Json::Value root; Json::Reader reader; std::ifstream jsonFile("your_file.json"); if (!reader.parse(jsonFile, root)) { std::cerr << "解析JSON失败: " << reader.getFormattedErrorMessages() << std::endl; return 1; } // 确保解析结果是JSON对象 if (root.isObject()) { // 获取所有键名(即表头) std::vector<std::string> headers = root.getMemberNames(); // 遍历输出表头 std::cout << "提取到的表头:" << std::endl; for (const auto& header : headers) { std::cout << header << std::endl; } } else { std::cerr << "JSON根节点不是对象类型" << std::endl; return 1; } return 0; }
将Json::Value转为std::map的方法
如果确实需要将JSON对象转为std::map<std::string, Json::Value>,不要直接强制类型转换(这会触发你遇到的E0312类型错误),而是通过遍历键名列表手动构建map:
代码示例
#include <json/json.h> #include <fstream> #include <map> #include <iostream> int main() { Json::Value root; Json::Reader reader; std::ifstream jsonFile("your_file.json"); if (!reader.parse(jsonFile, root)) { std::cerr << "解析JSON失败: " << reader.getFormattedErrorMessages() << std::endl; return 1; } std::map<std::string, Json::Value> jsonMap; if (root.isObject()) { std::vector<std::string> keys = root.getMemberNames(); for (const auto& key : keys) { jsonMap[key] = root[key]; } // 遍历map验证 std::cout << "遍历map的键值对:" << std::endl; for (const auto& pair : jsonMap) { std::cout << "键:" << pair.first << ",值类型:" << pair.second.type() << std::endl; } } else { std::cerr << "JSON根节点不是对象类型" << std::endl; return 1; } return 0; }
注意事项
- 调用
getMemberNames()前,必须用isObject()判断当前Json::Value是否为对象类型,避免非对象节点调用该方法导致的错误。 - 如果处理的是CSV转成的对象数组(JSON根节点是
[]结构),需要先遍历数组中的每个对象元素,再对每个元素提取键名。
内容的提问来源于stack exchange,提问作者Akash Rajawat
相关产品推荐
相关产品推荐

