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 })); } }
使用方式二选一:
- 全局添加转换器:在序列化选项中注册
var options = new JsonSerializerOptions { WriteIndented = true, Converters = { new SingleLineArrayConverter() } };
- 属性标记:给
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
相关产品推荐
相关产品推荐

