C++中如何使用toml++将TOML数据解析转换为JSON数据
代码问题修复
你当前的实现有4处会导致编译失败/运行异常的问题:
- 变量名笔误:TOML解析结果存入了成员变量
_data_table,但输出到流时传入了未定义的变量data,直接触发编译错误。 - 流指针位置bug:将JSON格式内容写入字符串流后,读指针默认停在流末尾,直接调用流版本的
json::parse会读到空内容,解析结果异常。 - 异常逻辑失效:catch块中仅构造了
std::runtime_error临时对象,没有通过throw抛出,异常会被直接吞掉;且错误分支无返回值,触发未定义行为。 - 缺少正常分支返回值:函数声明返回
json类型,但解析完成后没有返回构造好的JSON对象,编译不通过。
修正后完整实现
代码中保留了两个独立存储变量:_data_table存原始TOML解析结果,json_data存转换后的JSON数据,符合需求:
#include <sstream> #include <stdexcept> #include <iostream> #include <nlohmann/json.hpp> #include <toml++/toml.h> using json = nlohmann::json; json Services::getJsonData(std::string filePath) { try { // 存储TOML原生解析结果 _data_table = toml::parse(filePath); std::stringstream strm; strm << toml::json_formatter{_data_table}; // 存储转换后的JSON结构化数据 json json_data = json::parse(strm.str()); // 调试用:格式化打印JSON结果,缩进4字符 std::cout << json_data.dump(4) << std::endl; return json_data; } catch (const toml::exception &err) { std::cerr << "TOML parsing failed:\n" << err.what() << "\n"; throw std::runtime_error(err.what()); } catch (const json::parse_error &err) { std::cerr << "JSON conversion failed:\n" << err.what() << "\n"; throw std::runtime_error(err.what()); } }
补充说明
toml::json_formatter已经做了全类型兼容,TOML特有的日期时间、内联表、表数组等类型都会自动映射为JSON支持的对应类型,不需要手动做类型转换。- 两个存储变量完全解耦:后续如果需要修改TOML结构、查询TOML原生节点直接操作
_data_table即可;需要做JSON序列化、接口传参等操作直接用json_data,互不影响。 - 如果不需要格式化打印JSON,删掉
std::cout相关行即可,不影响转换逻辑。
内容的提问来源于stack exchange,提问作者Bugsfounder
相关产品推荐
相关产品推荐

