【问题标题】:Returning two dimenstional array as json from mvc controller从 mvc 控制器返回二维数组作为 json
【发布时间】:2012-02-25 23:07:04
【问题描述】:

我想使用 return Json(myObject) 从 MVC 控制器以 json 格式返回二维矩阵。 目前我这样做: 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;
});

除了我想避免在 myObject 上调用 ToJaggedArray() 之外,这一切都很好。有什么我可以实现的(接口或其他东西)让它开箱即用吗?检索二维数组很重要,因此实现 IEnumerable 不是一种选择...

【问题讨论】:

    标签: c# javascript json controller asp.net-mvc-4


    【解决方案1】:

    实现 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 将自定义转换器添加到序列化程序,但这似乎有点过头了,只是为了摆脱直接的方法调用。

    【讨论】:

    • 哦,很简单。我没有想过像你那样枚举维度。这样就解决了,谢谢。我认为没有办法让它用更少的代码工作,但如果有人看到它并且它不是已接受答案的变体,那么请发布它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多