JsonSerializerOptions 通过设置 WriteIndented = true 可实现 JSON 缩进输出(2空格),仅作用于序列化;美化原始 JSON 字符串需先解析再序列化,.NET 6+ 推荐 JsonNode.Parse(jsonStr).ToString()。

用 JsonSerializerOptions 控制缩进输出(.NET 5+)
默认序列化是紧凑无换行的,要美化必须显式开启格式化。核心是配置 JsonSerializerOptions 的 WriteIndented 属性为 true,否则无论输入是否带空格,输出都是单行。
- 仅对序列化(对象 → JSON 字符串)生效;反序列化(JSON → 对象)不关心缩进
-
WriteIndented = true会自动添加 2 空格缩进,不可自定义空格数(如想用 4 空格或制表符,得自己后处理) - 如果传入的是原始 JSON 字符串(不是对象),直接用
JsonSerializer.Serialize不会“美化”它——它会被当成字符串值原样嵌套,必须先反序列化再重序列化
示例:
var options = new JsonSerializerOptions { WriteIndented = true };
string json = JsonSerializer.Serialize(data, options);
把已有 JSON 字符串重新格式化(非对象场景)
你手上只有 string 类型的 JSON(比如从文件读取、API 响应拿到的原始文本),想加缩进?不能跳过解析步骤。必须先用 JsonDocument.Parse 或 JsonNode.Parse 解析成结构,再用 ToString() 或 Serialize 输出美化版。
-
JsonDocument.Parse(jsonStr)最轻量,适合只读场景;调用RootElement.ToString()即得缩进格式 -
JsonNode.Parse(jsonStr)(.NET 6+)更灵活,支持修改后再输出,ToString()同样返回美化结果 - 别用
JsonConvert.SerializeObject(JsonConvert.DeserializeObject(jsonStr))(Newtonsoft)来回套——性能差且可能丢失注释/格式细节(虽然 JSON 标准本不支持注释)
示例(.NET 6+):
string pretty = JsonNode.Parse(jsonStr)?.ToString() ?? jsonStr;
Newtonsoft.Json(Json.NET)怎么等效实现
老项目还在用 Newtonsoft?对应方案是 JsonConvert.SerializeObject 配 Formatting.Indented 参数,或者用 JsonTextWriter 手动控制。
- 最简方式:
JsonConvert.SerializeObject(obj, Formatting.Indented) - 若输入是字符串,同样要先
JsonConvert.DeserializeObject再序列化,否则只是把字符串当普通值包一层 - 注意:Newtonsoft 默认缩进是 2 空格,但可通过
JsonSerializerSettings的IndentChar和Indentation微调(比如设为'\t'和1)
示例:
string pretty = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(jsonStr), Formatting.Indented);
缩进带来的实际影响和坑
加缩进不是纯显示问题,会影响体积、传输、解析行为。
- 输出体积明显增大(每层缩进多几个空格,数组/对象多换行),日志或 API 响应中慎用,尤其高频小数据
- 某些老旧系统或嵌入式 JSON 解析器对换行敏感,可能报
Unexpected character错误(虽不符合标准,但真实存在) - 用
==或哈希比对两个逻辑相同但缩进不同的 JSON 字符串,结果为false——调试时容易误判“内容不同” - VS 调试器里看
ToString()结果自带缩进,不代表变量值真含那些空格;真正写入文件或网络前才决定是否启用格式化
美化只是开发期便利手段,上线前确认是否真需要——多数生产环境该关就关。










