2012-02-25 60 views
3

我想从使用return Json(myObject)一个MVC控制器作为JSON返回一个2D矩阵。 目前,我做这种方式: return Json(myObject.ToJaggedArray())返回2个dimenstional阵列JSON从MVC控制器

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

实现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每一次迭代只是产生了当前行作为1维数组,Field[](或在本例中,int[])。

更新:另一个选项

更多的工作需要,但你也可以实现自己的JsonResult,增加了一个自定义的转换器来使用JavascriptSerializer.RegisterConverters串行,但似乎有点洁癖只是为了摆脱一个直接的方法调用。

+0

哦,真的很容易。我没有想过按照你做过的方式列举维度。这解决了,谢谢。 我认为没有办法让它使用更少的代码工作,但如果有人看到它,它不是接受的答案的变体,那么请张贴它! – 2012-02-26 12:57:18

相关问题