为什么c# javascript序列化器.序列化返回空方括号

本文关键字:序列化 方括号 返回 javascript 为什么 | 更新日期: 2023-09-27 18:09:29

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

注: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知道为什么要用方括号。将两个都标记为回答,但只能标记一个。

为什么c# javascript序列化器.序列化返回空方括号

从根源上看,问题似乎是以下几件事的结合。

正如@Parv已经指出的那样,您获得[]的原因是因为您的类实现了IEnumerable,因此序列化器尝试迭代对象,然后独立地序列化每个项。你当前的设计是不工作的,因为它不是为实现IEnumerable的类型序列化公共属性而设计的。

另一个问题,就像我在评论中提到的,是你的类似乎没有任何公共属性,你现在所拥有的是公共变量。为了使序列化器工作,你需要属性setter/getter,即
public class dg
{
    public int id { get; set; }
    public string title { get; set; }
    ...
}

问题可能是由于dg类继承了IEnumerable, JavaScriptSerializer将其视为Array,因此使用方括号。

尝试

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