2014-11-02 68 views
2

我在序列化时遇到了困难。我有一个使用ajax调用从服务器端返回对象的aspx页面。为Json序列化2D阵列

希望的输出

ModelPoints = [[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 ]},{积分= [1,2,3]}}

的应用程序流是

的Ajax - > .aspx的 - > WCF - > .aspx的 - >的Ajax

以下是正在序列化不正确的类。我如何重组这个,以便它的工作?我不想多次解析18000多个点,所以服务器的输出应该是正确的格式。即我无法在客户端解析它。

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

下面

[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; } 
    } 
} 
+0

而是具有独立的类的,在建立模型类不是ModelPoint类的点阵列。 – WebSight 2014-11-02 07:48:06

回答

0

中的类JSON,方括号[]表示的阵列和大括号{}表示的对象。因此,您希望的输出代表的数据结构:

[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]] 

是整数的2维数组。为了获得在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}}; 
0

你基本上只需要制作一个二维数组。假设你使用DataContractJsonSerializer你的WCF终结模型类应该是这样的:

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]]}