【问题标题】:why does c# JavaScriptSerializer.Serialize return empty square brackets为什么 c# JavaScriptSerializer.Serialize 返回空方括号
【发布时间】:2013-04-15 12:32:50
【问题描述】:

为什么下面的代码应该返回 "{"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 知道为什么有方括号。将两者都标记为答案,但只能标记一个。

【问题讨论】:

  • dg=[serializable]?
  • dg 是否有一个与您的示例中的重载匹配的构造函数,并且该重载是否正确地将值分配给相应的属性?
  • @Brad - 在 dg 上有或没有 [Serializable] 标记时,我得到相同的结果
  • @Dmitri - 是的,有构造函数,并且可以在调试中单步执行以查看 dg 对象是否正确(与上面的代码不同,但可以完成)
  • 您尚未发布 ScheduleObserver 的实现,但据我所知,您没有任何 public setter/getter。

标签: c# json javascriptserializer


【解决方案1】:

看看source,问题似乎是几件事的结合。

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

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

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

【讨论】:

    【解决方案2】:

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

    尝试做

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

    【讨论】:

    • @James IEnumerable 是类型 dg 的实现接口
    • 非常酷...而且我只对 foreach 循环使用 ienumerable
    猜你喜欢
    • 2016-04-30
    • 2012-02-08
    • 2016-06-04
    • 2021-07-21
    • 2021-10-11
    • 2012-07-29
    • 1970-01-01
    • 2020-06-08
    • 2021-11-15
    相关资源
    最近更新 更多