2013-04-15 50 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