2013-04-15 51 views
6

爲什麼下面的代碼返回 「[]」 時,它應該返回 「{」 ID 「:1999年, 」稱號「:」 hithere「}爲什麼C#JavaScriptSerializer.Serialize返回空方括號

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    StringBuilder sbJsonResults = new StringBuilder(); 
    var result = serializer.Serialize(new dg(1999, "hithere")); 

    context.Response.Clear(); 
    context.Response.ContentType = "application/json; charset=utf-8"; 
    context.Response.Cache.SetExpires(DateTime.MinValue); 
    context.Response.Write(result); 

PS的DG類看起來是這樣的:。

public class dg : ScheduleObserver, ILibrary, IEnumerable { 
     public int id; 
     public string title; 
     private List<d> dList; 
     ...many getters and setters and some logic functions... 
    } 

    public abstract class ScheduleObserver{ 
     public abstract void update(); 
    } 

    public interface ILibrary { 
     List<PD> getPDs(); 
     void setPDs(List<PD> newPDs); 
     int getCurrentIndex(); 
     void addPD(PD pD); 
     PD getPD(int index); 
    } 

非常感謝

謝謝 - 成功回答了 - 這是IEnumerable的,這是我的困境的源頭上解決它,DG不再擴展IEnumerable和所有foreach(dg ...)循環已被轉換回for(int i = 0 ...)循環。

非常感謝,非常感謝!詹姆斯得到了爲什麼它是空的,帕夫得到了爲什麼有方括號。將兩者都標記爲答案,但只能標記一個。

+0

'dg' ='[serializable]'? –

+0

是否有一個構造函數與您的示例中的重載匹配,並確保該重載能夠正確地將值分配給相應的屬性? – Dimitri

+0

@Brad - 我得到了相同的結果,帶有或不帶[Serializable]標籤dg – user2282496

回答

4

望着source問題似乎是兩件事情的組合。

正如@Parv已經指出了原因,你得到[]是因爲你的類實現IEnumerable所以串行試圖迭代對象,然後單獨序列的每個項目。您當前的設計不起作用,因爲它不用於序列化實現IEnumerable類型的公共屬性。

另一個問題,就像我在評論中提到的,您的班級似乎沒有任何公共屬性,您目前所擁有的是公共變量。爲了使序列化器正常工作,你需要屬性設置器/獲取器,即

public class dg 
{ 
    public int id { get; set; } 
    public string title { get; set; } 
    ... 
} 
3

的問題可能是因爲dg類繼承IEnumerable,將JavaScriptSerializer被處理它作爲一個Array,因此方括號。

嘗試做

var result = serializer.Serialize(
    new dg(1999, "hithere").Select(d => new{ id = d.id, title = d.title })); 
+0

@James IEnumerable是一個類型爲dg –

+0

的非常酷的實現接口...而我只在foreach循環中使用了ienumerable – user2282496