Возвращение двухмерного массива в виде json из контроллера mvc - PullRequest
3 голосов
/ 26 февраля 2012

Я хочу вернуть 2d-матрицу из контроллера MVC как json, используя return Json(myObject). На данный момент я делаю это так: return Json(myObject.ToJaggedArray()).

Метод ToJaggedArray выглядит следующим образом:

public Field[][] ToJaggedArray()
{
    var jaggedArray = new Field[Rows][];

    for (int i = 0; i < Rows; ++i)
    {
        jaggedArray[i] = new Field[Columns];

        for (int j = 0; j < Columns; j++)
        {
            jaggedArray[i][j] = this[i, j];
        }
    }

    return jaggedArray;
}

я заставляю js звонить так:

var data = {};

$.getJSON("/Game/GetBoard", function (json) {
    data = json;
});

Все это работает хорошо, за исключением того факта, что я хотел бы избежать вызова ToJaggedArray () для myObject. Есть ли что-то, что я могу реализовать (интерфейс или что-то), чтобы заставить его работать из коробки? Важно получить двумерный массив, поэтому реализация IEnumerable не является опцией ...

1 Ответ

1 голос
/ 26 февраля 2012

реализация IEnumerable не является опцией

Судя по приведенному вами описанию, конечно, это так - хотя я не вполне уверен, что выпытаюсь сделать.Но если это просто избавление от вызова ToJaggedArray():

public class YourClass : IEnumerable
{
    // ...

    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < Rows; i++)
        {
            Field[] result = new Field[Columns];
            for (int j = 0; j < Columns; j++)
            {
                result[j] = this[i, j];
            }
            yield return result;
        }
    }
}

Пример вывода (с использованием int[3,3] вместо Field[,]):

[[2,4,6],[1,2,3],[3,7,9]]

Каждая итерация завершаетсяIEnumerable просто возвращает текущую строку в виде одномерного массива, Field[] (или в примере int[]).

Обновление: еще один параметр

Требуется больше работы, но вы также можете реализовать свой собственный JsonResult, который добавляет настраиваемый конвертер в сериализатор, используя JavascriptSerializer.RegisterConverters , но это кажется слишком сложным, чтобы избавиться от прямоговызов метода.

...