JsonConvert之间的wierd奇数.SerializeObject和json.stringfy

本文关键字:json stringfy SerializeObject 奇数 之间 wierd JsonConvert | 更新日期: 2023-09-27 17:59:41

我使用的是一个JavaScript客户端和一个用JSON来回发送消息的c#套接字服务器。

在服务器上,我有一个多维数组,如下所示:

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,4]

有人能解释一下为什么c#序列化和JavaScript字符串给出不同的值吗?

我试过

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异常;

在Jeff的帮助下,终于找到了答案

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)的工作方式与我想要的类似

谢谢你为我指明了正确的方向Jeff

JsonConvert之间的wierd奇数.SerializeObject和json.stringfy

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)