使用RapidJSON库读写JSON文件时如何保留缩进?
问题
在Visual Studio 2017的Windows平台C++程序中,使用RapidJSON读写JSON文件时,写入的目标文件丢失了所有缩进格式。
原读取代码:
FILE* fp = fopen(inputJson, "rb"); // non-Windows use "r" char readBuffer[65536]; FileReadStream is(fp, readBuffer, sizeof(readBuffer)); Document d; d.ParseStream(is); fclose(fp); std::string json_str(readBuffer);
原写入代码:
FILE* fp2 = fopen(outputJson, "wb"); // non-Windows use "w" char writeBuffer[65536]; FileWriteStream os(fp2, writeBuffer, sizeof(writeBuffer)); Writer<FileWriteStream> writer(os); d.Accept(writer); fclose(fp2);
源文件示例内容:
{ "name" : "test_rapid", "rect_obj": [ { "name": "high school mathematics", "price": 12, "fg_color": { "input_type": "val_map_c", "input": { "measname": "MetaData_eOrigin_c", "values": [0], "mapping": ["white"], "out_of_range" : "white" } } },
写入后的目标文件内容(缩进丢失):
{"name":"test_rapid","rect_obj":[{"name":"high school mathematics","price":12,"fg_color":{"input_type":"val_map_c","input":{
解决方案
RapidJSON默认的Writer会生成紧凑的无格式JSON,要保留缩进格式,需要使用**PrettyWriter**替代Writer,它会自动添加缩进、换行和空格来格式化输出。
修改后的写入代码如下:
FILE* fp2 = fopen(outputJson, "wb"); // non-Windows use "w" char writeBuffer[65536]; FileWriteStream os(fp2, writeBuffer, sizeof(writeBuffer)); // 替换Writer为PrettyWriter,可自定义缩进规则 PrettyWriter<FileWriteStream> writer(os); writer.SetIndent(' ', 4); // 设置每级缩进为4个空格(可选,默认即为4空格) d.Accept(writer); fclose(fp2);
补充说明
PrettyWriter是Writer的派生类,专门用于生成可读性强的格式化JSON;- 若偏好制表符缩进,可将
SetIndent的第一个参数改为'\t'; - 原读取代码中的
std::string json_str(readBuffer);存在错误:readBuffer是流的临时缓冲区,并非解析后的完整JSON字符串,若要获取格式化字符串,需通过PrettyWriter写入StringBuffer实现,而非直接读取缓冲区。
内容的提问来源于stack exchange,提问作者RKum
相关产品推荐
相关产品推荐

