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

C#中使用JsonSerializer序列化时,如何让JSON数组单行显示?

问题:C# JsonSerializer开启缩进后,如何让特定数组单行显示

开启WriteIndented = true后,数组(如SpeakerVolumes)被拆分成多行,期望让这类数组保持单行紧凑显示。

当前生成的JSON片段:

[
  {
    "filePath": "C:\\Users\\Audio\\2.mp3",
    "playAddress": 0,
    "loop": false,
    "SpeakerVolumes": [
      0,
      0,
      0,
      ... // 省略重复元素
      0
    ],
    // 其他字段
  }
]

当前保存代码:

void saveCfg()
{
    Console.WriteLine(firstSave);
    if (firstSave == true)
    {
        firstSave = false;
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        saveFileDialog1.Filter = "config files (*.json)|*.json|All files (*.*)|*.*";
        saveFileDialog1.FilterIndex = 2;
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            writeFilePath = saveFileDialog1.FileName;
        }
    }
    List<AudioDataFormat> audioData = new List<AudioDataFormat>();
    for (int i = 0; i < audioFilePaths.Count; i++)
    {
        audioData.Add(new AudioDataFormat()
        {
            filePath = audioFilePaths[i],
            playAddress = playAddress[i],
            loop = loop[i],
            SpeakerVolumes = speakerVolumes[i],
            fades = fades[i],
            fadeAddress = fadeAddress[i],
            fadeVol = fadeVol[i],
            fadeTime = fadeTime[i],
        });
    }
    var options = new JsonSerializerOptions { WriteIndented = true };
    string json = JsonSerializer.Serialize(audioData.ToArray(), options);
    File.WriteAllText(writeFilePath, json);
}

解决方案

默认JsonSerializer没有内置“部分缩进”的配置,要实现特定数组单行显示,有两种可靠方式:

方式一:自定义JsonConverter(推荐)

针对目标数组类型(如int[])编写自定义转换器,在缩进模式下强制将数组序列化为单行:

public class SingleLineArrayConverter : JsonConverter<int[]>
{
    public override int[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return JsonSerializer.Deserialize<int[]>(ref reader, options);
    }

    public override void Write(Utf8JsonWriter writer, int[] value, JsonSerializerOptions options)
    {
        // 以无缩进模式序列化数组,直接写入为单行
        writer.WriteRawValue(JsonSerializer.Serialize(value, new JsonSerializerOptions { WriteIndented = false }));
    }
}

使用方式二选一:

  1. 全局添加转换器:在序列化选项中注册
var options = new JsonSerializerOptions 
{ 
    WriteIndented = true,
    Converters = { new SingleLineArrayConverter() }
};
  1. 属性标记:给AudioDataFormat的目标数组属性添加特性
public class AudioDataFormat
{
    public string filePath { get; set; }
    public int playAddress { get; set; }
    public bool loop { get; set; }
    [JsonConverter(typeof(SingleLineArrayConverter))]
    public int[] SpeakerVolumes { get; set; }
    // 其他属性...
}

方式二:正则替换(简易临时方案)

如果不想编写自定义转换器,可先正常序列化带缩进的JSON,再用正则将多行数值数组替换为单行:

var options = new JsonSerializerOptions { WriteIndented = true };
string json = JsonSerializer.Serialize(audioData.ToArray(), options);
// 匹配多行数值数组,替换为单行格式
json = Regex.Replace(json, @"\[\s+(?<values>(\d+,\s*)+\d+)\s+\]", "[$1]");
File.WriteAllText(writeFilePath, json);

注意:此方法仅适用于简单数值数组,若数组包含字符串或复杂对象,需调整正则表达式避免出错。


内容的提问来源于stack exchange,提问作者Gvmarle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:06:31