如何防止 JsonWriter 在序列化多维数组时添加太多换行符?



最近我一直在做一个瓦片地图编辑器。我正在使用C#,MonoGame和Newtonsoft.Json 基本上,我想使用图层类列表序列化地图类。 问题是,在 Layer 类内部序列化int[,] MAP时,它会为数组的每个元素添加换行符。

我想实现此输出:

"MAP": 
[
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17],
[17,17,17,17,17,17,17,17,17,17]
]

我得到的:

"MAP": 
[
17,
17,
17,
17,
17,
17,
17,
17,
17,
17
],
[
17,
17,
17,
17,
17,
17,
17,
17,
17,
17
],
and so on

我怎样才能避免这种情况?

我的序列化代码:

public void Save(string path, object obj)
{
using (TextWriter sw = new StreamWriter(path))
using (JsonWriter writer = new JsonTextWriter(sw))
{
JsonSerializer serializer = new JsonSerializer();
writer.Formatting = Formatting.Indented;
serializer.Serialize(writer, obj);
writer.Close();
}
}

您可以创建自定义JsonConverter,以将编写器的Formatting设置切换为以适当的时间间隔None

public class CustomFormattingMatrixConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(int[,]);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
int[,] array = (int[,])value;
writer.WriteStartArray();
for (int i = 0, bound0 = array.GetUpperBound(0); i <= bound0; i++)
{
writer.WriteStartArray();
writer.Formatting = Formatting.None;
for (int j = 0, bound1 = array.GetUpperBound(1); j <= bound1; j++)
{
writer.WriteValue(array[i, j]);
}
writer.WriteEndArray();
writer.Formatting = Formatting.Indented;
}
writer.WriteEndArray();
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

然后像这样将它与序列化程序一起使用:

JsonSerializer serializer = new JsonSerializer();
serializer.Converters.Add(new CustomFormattingMatrixConverter());
writer.Formatting = Formatting.Indented;
serializer.Serialize(writer, obj);

此处的工作演示:https://dotnetfiddle.net/q3P0en

writer.Formatting = Formatting.None;

而不是

writer.Formatting = Formatting.Indented;

最新更新