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

如何使用jsoncons编辑深度嵌套JSON文件并保存修改后的副本?

问题核心原因

你之前的代码用as<T>方法将json节点转为std::map/std::vector的操作确实是值拷贝,所有修改都作用在副本上,不会影响原始json对象,自然需要手动重构整个结构,这完全没必要。jsoncons的json类型原生支持对JSON对象、数组的直接引用访问,不需要额外转成STL容器。

解决方案

方法1:层级直接访问修改(适合结构固定的场景)

直接通过[]运算符逐层访问目标节点,返回的是原节点的非const引用,修改直接生效,无任何额外拷贝:

const jsoncons::json& TestMessage::injectPathToFMTemplate(const std::string &scanPath) {
    auto& parsed = this->_templateMessage;
    // 直接拿到data数组的引用
    jsoncons::json& data_arr = parsed["data"];
    // 遍历每个采集器节点
    for (size_t i = 0; i < data_arr.size(); ++i) {
        jsoncons::json& grabber = data_arr[i];
        jsoncons::json& scan_location = grabber["scanLocation"];
        // 直接修改对应uri字段,改动直接作用在原对象上
        scan_location["Original_ScaledDown"]["uri"] = scanPath;
        scan_location["Undistorted_ScaledDown"]["uri"] = scanPath;
        scan_location["Unprocessed"]["uri"] = scanPath;
    }
    return parsed;
}

方法2:JSONPath批量修改(适合批量匹配同名字段的场景)

如果要修改所有层级下的uri字段,不需要手写层级遍历逻辑,直接用jsoncons扩展的JSONPath功能批量查询修改,灵活性更高:

// 需要提前引入头文件:#include <jsoncons_ext/jsonpath/json_query.hpp>
const jsoncons::json& TestMessage::injectPathToFMTemplate(const std::string &scanPath) {
    auto& parsed = this->_templateMessage;
    using namespace jsoncons::jsonpath;
    // 查询所有层级下的uri节点,返回节点引用视图
    auto uri_nodes = json_query(parsed, "$..uri", result_options::path_nodes);
    for (auto& node : uri_nodes) {
        node.value() = scanPath;
    }
    return parsed;
}

修改结果保存

如果需要将修改后的JSON保存为文件,直接用如下代码即可:

std::ofstream output_file("modified_result.json");
// 格式化输出,方便阅读
output_file << jsoncons::pretty_print(parsed);
// 不需要格式化的话直接输出即可:output_file << parsed;
output_file.close();

如果需要拿到字符串形式的结果,直接调用parsed.to_string()即可。

注意事项

如果不确定JSON结构是否一定包含对应键,可以先调用contains方法判断键是否存在,避免访问不存在的键抛出异常:

if (parsed.contains("data") && parsed["data"].is_array()) {
    // 后续业务逻辑
}

内容的提问来源于stack exchange,提问作者Gulzar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:06:03