2011-08-14 5 views
0

ここでは、私がやっていることの基本的な性質があります。注:これは擬似コードです。このコードはメモリからのもので、シンタックスについて私に吠えるintellisenseはありません! :-).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以上のプロパティがあります。私のアプリは、各イベントがアポイントやワークショップであるかどうかには無関係なので、JSの面では本当に役に立ちます。

アポイントメントとワークショップ一般的には、EventViewで全く同じプロパティを使用していません(注意:Appointmentはprop1とprop2を使用し、Appointmentはprop1、prop2、prop3とprop5を使用します)。

現在、私は送信していますJSONの200KBをこのリクエストの結果として返します。悲しいことに、おそらく25このうち%はシリアライズされていて使用されていないプロパティからのものです - {prop1='value', prop2='value', prop3='', prop4='', prop5=''}としてシリアル化されたワークショップを送り返してください。

コントローラのreturn Json(data)には、すべてのシリアル化されたデータを繰り返し処理し、値のないすべてのプロパティを削除する方法がありますか?基本的には、これを実現するメソッドを記述したいと思います。json(data).RemoveEmptyProperties();

考えられますか?

答えて

1

Traversのライブラリ(https://github.com/substack/js-traverse)を使用して、このようなものは、すべての空のノードが削除されます:あなたはNewtonSoft JSONライブラリを使用する場合

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); 
}); 
3

オブジェクトの形状を小さくし、必要なプロパティだけを作成します。それをシリアル化してください。

3

を、あなたはどの制御することができますオブジェクトのプロパティは、それらの前に属性を追加するだけでシリアライズされます(JsonIgnore)。また、(JsonProperty属性を使用して)プロパティ名を微調整して、さらに多くのことを行うことができます。組み込みのJsonシリアライザよりもはるかに簡単にこのライブラリを使用できます。

関連する問題