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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:48:07