这是我正在做的事情的基本性质。注意:这是伪代码..这段代码来自内存,我没有智能感知我的语法! : - )
(代码后的说明)
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();
思想?
答案 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);
});