c# - JsonConvert.SerializeObject 和 json.stringify 之间的奇怪现象

标签 c# json.net

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

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

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# 序列化和 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) 就像我想要的那样工作

感谢杰夫为我指明了正确的方向

最佳答案

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)

关于c# - JsonConvert.SerializeObject 和 json.stringify 之间的奇怪现象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904346/

相关文章:

c# - 业务对象和数据层

c# - 将(许多)JSON 不同对象解析为 C# 类。强类型更好吗?

c# - 尝试使用JSON.NET和DataContractJsonSerializer反序列化JSON失败

c# - 序列化抛出 NotImplementedException 的属性

json.net - NewtonSoft.Json.xml 文件引用了一个未随附的文件,这会导致 SandcaSTLe 破坏

c# - 使用 JSON.NET,如何序列化这些继承的成员?

c# - 让柱形图在图表控件中重叠

c# - 如何更改已部署应用程序中的数据库设计?

c# - 如何在.Net最新版本中获取某个文件类型的IPreviewHandler

c# - 将目标放置在嵌套控件中