2013-02-15 96 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

相關問題