关于System.Text.Json数组元素序列化压缩与换行格式的技术问询
System.Text.Json数组元素序列化压缩与换行格式的技术问询
当然可以实现你想要的效果!就是让数组里每个元素单独占一行,但每个元素本身是**压缩(minified)**的格式对吧?我看你已经用到了Utf8JsonWriter,刚好可以基于这个思路调整,下面给你两种可行的方案:
方案一:用Utf8JsonWriter手动控制格式(高效适合大数据)
这种方式性能更好,适合处理大量数据,不会产生过多中间字符串:
using System.Dynamic; using System.IO; using System.Text.Json; using System.Collections.Generic; namespace JsonArraySerialisationTest { internal class Program { static void Main() { // 创建测试数据 const int itemCount = 2; List<ExpandoObject> items = new List<ExpandoObject>(); for (int i = 0; i < itemCount; ++i) { dynamic item = new ExpandoObject(); item.prop1 = i; item.prop2 = (char)('a' + i); items.Add(item); } string outputJson; using (MemoryStream outputStream = new MemoryStream()) { // 配置:元素内部压缩,不缩进 JsonWriterOptions writerOptions = new JsonWriterOptions { Indented = false, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; using (Utf8JsonWriter writer = new Utf8JsonWriter(outputStream, writerOptions)) { // 手动开启数组 writer.WriteStartArray(); foreach (var item in items) { // 序列化单个元素(压缩格式) JsonSerializer.Serialize(writer, item); // 每个元素后写入换行符,实现换行 writer.WriteRawValue("\n"); } // 关闭数组 writer.WriteEndArray(); } // 把内存流转换为字符串,同时去掉最后多余的换行 outputStream.Position = 0; using (StreamReader reader = new StreamReader(outputStream)) { outputJson = reader.ReadToEnd().TrimEnd('\n'); } } Console.WriteLine(outputJson); } } }
关键说明:
JsonWriterOptions.Indented = false确保单个元素内部是完全压缩的,没有多余空格或换行- 手动控制数组的
WriteStartArray和WriteEndArray,这样我们可以在每个元素序列化后手动插入换行符,精准控制格式 - 最后用
TrimEnd('\n')去掉最后一个元素后面多余的换行,让格式更工整
运行后输出会是这样:
[{"prop1":0,"prop2":"a"}, {"prop1":1,"prop2":"b"}]
方案二:字符串拼接(简洁适合小数据)
如果你的数据量不大,这种写法更简洁直观:
// 先把每个元素序列化为压缩的字符串 var itemJsonStrings = items.Select(item => JsonSerializer.Serialize(item, new JsonSerializerOptions { WriteIndented = false }) ); // 用换行加逗号拼接,再包裹数组括号 outputJson = $"[{string.Join(",\n", itemJsonStrings)}]";
这种方式省去了流操作,代码更短,但如果数据量很大,会产生较多中间字符串,内存占用会比方案一高一些。
备注:内容来源于stack exchange,提问作者ElGordo
相关产品推荐
相关产品推荐

