为Json串行化2D阵列

本文关键字:2D 阵列 Json | 更新日期: 2023-09-27 18:28:42

我在序列化方面遇到了困难。我有一个aspx页面,它使用ajax调用从服务器端返回对象。

所需输出

ModelPoints=[[1,2,3],[1,2,3],[1,2],[1,3],[1,2,3],[1,3]](对于WebGL)

实际输出ModelPoints={{Points=[1,2,3]},{Pointss=[1,3〕},{Points=[1,2,3]},}

应用程序流程为

Ajax->Aspx->WCF->Aspx->Ajax

以下是被错误序列化的类。我该如何重组它以使其发挥作用?我不想多次解析18000多个pts,所以服务器的输出应该是正确的格式。即我负担不起在客户端解析它。

对象名称"点"来自参数名称,如何对浮动的二维数组执行此操作。

以下的类别

[Serializable()]
public class ModelPoint
{
    public ModelPoint()
    {
    }
    public ModelPoint(float x, float y, float z)
    {
        _points = new List<Nullable<float>>();
        _points.Add(x);
        _points.Add(y);
        _points.Add(z);
    }
    private List<Nullable<float>> _points;
    public List<Nullable<float>> Points
    {
        get {return _points;}
        set { _points = value; }
    }
}
[Serializable()]
public class Model
{
    private List<ModelPoint> _modelPoints;
    [System.Xml.Serialization.XmlArray("ModelPoints", IsNullable = true)]
    [System.Xml.Serialization.XmlArrayItem()]
    public List<ModelPoint> ModelPoints 
    {
        get {return _modelPoints;}
        set { _modelPoints = value; }
    }
}

为Json串行化2D阵列

在json中,方括号[]表示数组,花括号{}表示对象。因此,由您想要的输出表示的数据结构:
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]

是一个二维整数数组。要在C#中获得它,您可以使用以下内容:

List<List<int>> model = new List<List<int>>()
model.Add(new List<int>() {1, 2, 3});
model.Add(new List<int>() {1, 2, 3});

或者类似的东西:

int[,] model = new int[5, 3] {{1,2,3},{1,2,3}};

您基本上只需要生成一个二维数组。假设您在WCF端点上使用DataContractJsonSerializer,那么Model类应该如下所示:

public class Model
{
    private float[][] _modelPoints;
    public float[][] ModelPoints
    {
        get { return _modelPoints; }
        set { _modelPoints = value; }
    }
}

请注意,我删除了所有的序列化属性(如果将它们留在序列化程序中,则神奇地输出backingfield而不是属性),并且我不再使用ModelPoint类。如果我把它输入DataContractJSONSerializer,我会得到你想要的输出:

var ds = new DataContractJsonSerializer(typeof(Model));
var model = new Model
    {
        ModelPoints = new[] { 
            new[] { 1f, 2f, 3f }, 
            new[] { 4f, 5f, 6f } }
    };
var sb = string.Empty;
using (var ms = new MemoryStream())
{
    ds.WriteObject(ms, model);
    sb= Encoding.UTF8.GetString(ms.ToArray());
}
Debug.WriteLine(sb);

在调试控制台中给出,这与您期望收到的内容类似。

{"ModelPoints":[[1,2,3],[4,5,6]]}