Как я могу запретить JsonWriter добавлять слишком много новых строк при сериализации многомерного массива? - PullRequest
1 голос
/ 25 сентября 2019

Недавно я работал над редактором тайлкарт.Я использую C #, MonoGame и Newtonsoft.Json В основном я хочу сериализовать класс Map со списком классов Layer.Проблема заключается в том, что при сериализации int[,] MAP внутри класса Layer добавляются новые строки для каждого элемента массива.

Я хочу получить такой вывод:

"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();
    }
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Вы можете сделать пользовательский 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

0 голосов
/ 25 сентября 2019
writer.Formatting = Formatting.None;

вместо

writer.Formatting = Formatting.Indented;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...