.NET MVC,从使用Json()序列化的对象中删除信息

时间:2011-08-14 17:23:20

标签: c# asp.net-mvc json

这是我正在做的事情的基本性质。注意:这是伪代码..这段代码来自内存,我没有智能感知我的语法! : - )

(代码后的说明)

Controller:

{
    public JSONResult GetCalendar(Form){
        var data = Workshops.Select().ToEventViews();
        var moreData = Appointments.Select().ToEventViews();

        data.AddRange(moreData);

        return Json(data);

    }
}

ViewModel
{
    public class EventView{
        string prop1;
        string prop2;
        string prop3;
        string prop4;
        string prop5;
    }
}

BLL 
{
    public EventView ToEventView(Workshop w){
        return new EventView{
            prop1 = w.thing;
            prop2 = w.thing2;
        //props 3, 4 and 5 not needed
        }
    }

    public EventView ToEventView(Appointment a){
        return new EventView{
            prop1 = a.thing;
            prop2 = a.thing;
            prop3 = a.thing;
            prop5 = a.thing;
        }
    }

    public List<EventView> ToEventView(List<Workshop> wshops){
        return wshops.ConvertAll(w=> w.ToEventView().ToList());
    }

    public List<EventView> ToEventView(List<Appointment> appts){
        return appts.ConvertAll(a=> a.ToEventView().ToList());
    }

}

我正在开发一个AJAX日历应用程序。正如你所看到的,我得到了一个工作室和约会的清单,它们有很多共同之处(属性方面)。EventView课程中实际上有20多个属性。因此,我做了一个ViewModel包含我需要序列化的属性,其中许多是约会和研讨会所共有的。这对JS方面非常有帮助,因为我的应用程序不知道每个事件是约会还是研讨会。

虽然约会和工作坊有很多共同点,但他们并没有在EventView中使用完全相同的属性集(注意Appointment只使用prop1和prop2,而Appointment使用prop1,prop2,prop3和prop5)。

目前,由于此请求,我发回了200KB的JSON。可悲的是,大概有25%是来自序列化但未使用的属性的毛病 - 发送回序列化为{prop1='value', prop2='value', prop3='', prop4='', prop5=''}的研讨会。

所以这就是问题:当我在控制器中return Json(data)时,有没有办法迭代所有序列化数据并删除所有没有值的属性?基本上我想写一个方法来完成这个:json(data).RemoveEmptyProperties();

思想?

3 个答案:

答案 0 :(得分:4)

如果使用NewtonSoft JSON库,只需在它们之前添加一个属性(JsonIgnore)即可控制对象的哪些属性被序列化。您还可以微调属性名称(使用JsonProperty属性)并执行更多操作。使用此库比使用内置的Json序列化器更容易粒度化。

答案 1 :(得分:3)

制作一个形状较小的对象,只需要您需要的属性。序列化。

答案 2 :(得分:1)

使用travers库(https://github.com/substack/js-traverse),这样的东西将删除所有空节点:

var traverse = require('traverse');

traverse(data).forEach(function (x) {
    var bUpdate = false;
    for( var key in x )
    { 
      if( "" === x[key] )
      {
        delete x[key];
        bUpdate = true;
      }
    if( bUpdate )this.update(x + 128);
});