2013-02-15 184 views
2

我正在与一个JavaScript客户端和一个C#套接字服务器在JSON中来回发送消息。奇怪之间JsonConvert.SerializeObject和json.stringify

在服务器上

我有一个多维数组,像这样:

MapData[0,0,0] = 1; 
MapData[0,0,1] = 2; 

其尺寸为900x900x2

在JavaScript

如果我做json.stringify(MapData)我得到这样

[[[1,2],[3,4]]]

但c#jsonconvert.serializeobject(MapData)给我这样: [1,2,3,4]

有人可以解释为什么c#serialize和JavaScript stringify赋予不同的值吗?

我试图

int[][][] MapData = new int[900][][]; 
// Zero out the map 
for (int variable1 = 0; variable1 <= 899; variable1++) { 
    for (int variable2 = 0; variable2 <= 899; variable2++) { 
     MapData[variable1][variable2][0] = 0; 
    } 
} 

但将在未处理的空异常属于MapData [变量1] [变量2] [0] = 0;

终于想通了与杰夫的帮助下

int[][][] MapData = new int[900][][]; 
// Zero out the map 
for (int a = 0; a < MapData.Length; a++) 
{ 
    MapData[a] = new int[900][]; 
    for (int b = 0; b < MapData[a].Length; b++) 
    { 
     MapData[a][b] = new int[2]; 
     for (int c = 0; c < MapData[a][b].Length; c++) 
       MapData[a][b][c] = 0; 
    } 
} 

那么JsonConvert.SerializeObject(属于MapData)就像我想

三江源指着我在正确的方向杰夫

回答

2

JsonConvert.SerializeObject()只是使用一个获取数组内容并将其序列化的迭代器。多维数组实现IEnumerable,所以这就是为什么你看到这种行为。

JsonConvert.SerializeObject()会给你一个锯齿阵列的结果,例如MapData[0][0][1]

如果将.NET代码更改为使用锯齿阵列是可行的,那么我建议你这样做。如果没有,你可以序列化之前做即时转换:

var jagged = 
    Enumerable.Range(0, MapData.GetLength(0)).Select(
     i => Enumerable.Range(0, MapData.GetLength(1)).Select(
      j => Enumerable.Range(0, MapData.GetLength(2)).Select(
       k => MapData[i,j,k]).ToArray()).ToArray()).ToArray(); 
JsonConvert.SerializeObject(jagged) 
+0

但我需要将整个数组转换成JSON客户端可以理解,因为它需要采取JSON和转储到一个与JavaScript阵列。 – BrierMay 2013-02-16 01:06:09

+0

然后将您的阵列更改为锯齿状阵列。或者在序列化之前即时修改它,尽管这样效率很低。 – 2013-02-16 01:26:12

+0

谢谢你指点我在你和谷歌之间的正确方向我知道了它。现在进入下一个问题 – BrierMay 2013-02-16 02:40:53