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

使用Boost::ptree/nlohmann库解析JSON,移除节点时如何保留控制字符?

解决JSON处理后丢失格式缩进的问题

针对nlohmann/json库

nlohmann库默认序列化输出紧凑格式,要保留缩进样式,只需在序列化时指定格式化参数:

#include <nlohmann/json.hpp>
#include <iostream>
#include <iomanip>

using json = nlohmann::json;

int main() {
    std::string raw_json = R"({
        "name": "test",
        "data": {
            "key1": "value1",
            "key2": "value2"
        }
    })";
    
    json j = json::parse(raw_json);
    // 移除目标节点键值对,示例:移除data下的key2
    j["data"].erase("key2");
    
    // 序列化时指定4个空格缩进,还原格式
    std::cout << std::setw(4) << j << std::endl;
    return 0;
}

通过std::setw(n)可以控制缩进级别,n为缩进的空格数,输出的JSON结构会和原始格式对齐,长度也会接近原始值。如果需要用tab缩进,可自定义格式化逻辑或调整参数配合tab字符。

针对Boost.PropertyTree库

Boost::ptree默认JSON序列化也是紧凑格式,要输出带缩进的JSON,需在写入时指定缩进参数:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <sstream>

namespace pt = boost::property_tree;

int main() {
    std::string raw_json = R"({
        "name": "test",
        "data": {
            "key1": "value1",
            "key2": "value2"
        }
    })";
    
    pt::ptree tree;
    std::istringstream iss(raw_json);
    pt::read_json(iss, tree);
    
    // 移除目标节点键值对,示例:移除data下的key2
    tree.get_child("data").erase("key2");
    
    std::ostringstream oss;
    // 传入4个空格作为缩进字符串,还原格式化输出
    pt::write_json(oss, tree, false, pt::json_parser::create_escapes, "    ");
    
    std::cout << oss.str() << std::endl;
    return 0;
}

write_json的第五个参数为缩进字符串,传入对应空格或tab即可匹配原始格式的缩进样式。

额外说明

  • 原始JSON中语法无关的空白字符(如多余换行、空格)会被解析库忽略,无法完全还原原始的每一处空白细节。如果业务需要严格保留所有原始字符(含特殊控制字符),需使用JSON分词器(Tokenizer)实现精准修改,不过这种场景极少。
  • 若你提到的"控制字符"是指JSON字符串内部的转义字符(如\n、\t),只要解析时库处理正确,序列化时会自动保留这些转义内容,不会丢失。你遇到的长度差异大概率是原始缩进空白被移除导致,用上述格式化方法即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:25:57