JsonConvert.SerializeObject和json.stringify之间奇怪的怪异

时间:2013-02-15 22:21:43

标签: c# json.net

我正在使用JavaScript客户端和c#套接字服务器在JSON中来回发送消息。

服务器上的

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

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

其尺寸为900x900x2

如果我json.stringify(MapData),我在JavaScript中

我就是这样的

[[[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 [variable1] [variable2] [0] = 0;

处抛出未处理的null异常

最后在杰夫的帮助下弄明白了

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)就像我想要的那样工作

谢谢你指出我正确的方向杰夫

1 个答案:

答案 0 :(得分: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)