C# 序列化Json的2D数组

C# 序列化Json的2D数组,c#,asp.net,ajax,serialization,C#,Asp.net,Ajax,Serialization,我在连载方面有困难。我有一个aspx页面,它使用ajax调用从服务器端返回对象 期望输出 模型点=[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3](用于WebGL) 实际产量 ModelPoints={{Points=[1,2,3]},{Points=[1,2,3]},{Points=[1,2,3]},{Points=[1,2,3]} 应用程序流程如下所示 Ajax->Aspx->WCF->Aspx->Ajax 下面是被错误序列化的类。我如何重新构造它,使其工作?

我在连载方面有困难。我有一个aspx页面,它使用ajax调用从服务器端返回对象

期望输出

模型点=[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3](用于WebGL)

实际产量 ModelPoints={{Points=[1,2,3]},{Points=[1,2,3]},{Points=[1,2,3]},{Points=[1,2,3]}

应用程序流程如下所示

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

下面是被错误序列化的类。我如何重新构造它,使其工作?我不想多次解析18000+pts,因此服务器的输出应该是正确的格式。i、 我不能在客户端解析它

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

下面的课程

[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; }
    }
}
[Serializable()]
公共类模型点
{
公共模型点()
{
}
公共模型点(浮点x、浮点y、浮点z)
{
_点=新列表();
_增加(x)点;
_增加(y)点;
_增加(z)点;
}
私人名单;;
公共列表点
{
获取{返回_点;}
设置{u points=value;}
}
}
[可序列化()]
公共类模型
{
私有列表(modelPoints);;
[System.Xml.Serialization.XmlArray(“ModelPoints”,IsNullable=true)]
[System.Xml.Serialization.XmlArrayItem()]
公共列表模型点
{
获取{return\u modelPoints;}
设置{u modelPoints=value;}
}
}

在json中,方括号[]表示数组,花括号{}表示对象。因此,由所需输出表示的数据结构:

[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
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);
是一个二维整数数组。要在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端点上使用,则模型类应如下所示:

public class Model
{
    private float[][] _modelPoints;

    public float[][] ModelPoints
    {
        get { return _modelPoints; }
        set { _modelPoints = value; }
    }
}
请注意,我删除了所有序列化属性(如果将它们保留在序列化程序上,则会神奇地输出backingfield而不是属性),并且我不再使用ModelPoint类。如果我向DataContractJSONSerializer输入数据,我将获得您想要的输出:

[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
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);
在调试控制台中提供与预期接收内容类似的内容

{“模型点”:[[1,2,3],[4,5,6]}


不要使用单独的类,而是在Model类而不是ModelPoint类中构建点阵列。