为什么c#JavaScriptSerializer.Serialize返回空方括号

时间:2013-04-15 12:32:51

标签: c# json javascriptserializer

为什么以下代码返回“[]”时应返回“{”id“:1999,”title“:”hithere“}

    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);

P.S。 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 ...)循环。

非常感谢,非常多!詹姆斯得到了为什么它是空的,帕尔夫得到了为什么有方括号。将两者都标记为答案,但只能标记一个。

2 个答案:

答案 0 :(得分:4)

查看source问题似乎是几件事的组合。

正如@Parv已经指出你得到[]的原因是因为你的类实现了IEnumerable所以序列化程序试图迭代对象然后序列化每个项目独立。您当前的设计无法正常工作,因为它不是为实现IEnumerable的类型序列化公共属性而设计的。

另一个问题,就像我在评论中提到的那样,你的班级似乎没有任何公共属性,你目前拥有的是公共变量。为了使序列化器工作,你需要属性设置器/ getter,即

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

答案 1 :(得分:3)

问题可能是因为dg类继承IEnumerableJavaScriptSerializer将其视为Array,因此方括号。

尝试

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