6

为什么下面的代码应该返回 "{"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);

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

非常非常感谢!JAMES 知道为什么它是空的,Parv 知道为什么有方括号。将两者都标记为答案,但只能标记一个。

4

2 回答 2

4

源头上看,问题似乎是几件事的结合。

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

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

public class dg
{
    public int id { get; set; }
    public string title { get; set; }
    ...
}
于 2013-04-15T13:33:42.763 回答
3

问题可能是因为dg该类继承了IEnumerable,所以JavaScriptSerializer将其视为 an Array,因此是方括号。

尝试做

var result = serializer.Serialize(
    new dg(1999, "hithere").Select(d => new{ id = d.id, title = d.title }));
于 2013-04-15T12:54:43.753 回答