使用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
相关产品推荐
相关产品推荐

