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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 02:44:48