2014-11-02 66 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]]}