2012-11-08 19 views
8

特定のクラスのオブジェクトのJsonResultを返すアクションがあります。ヌルフィールドを避けるために、このクラスのプロパティをいくつかの属性で修飾しました。クラス定義は次のとおりです。MVC4 nullなしでJsonResultを返すアクション

private class GanttEvent 
    { 
     public String name { get; set; } 

     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public String desc { get; set; } 

     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public List<GanttValue> values { get; set; } 
    } 

そして、私の行動に、私は、オブジェクト私が使用して返す

var res = new List<GanttEvent>(); 

使用:

生憎
return Json(res, JsonRequestBehavior.AllowGet); 

を、私はまだ出力でnull値を受けています:

[{"name":"1.1 PREVIOS AL INICIO ","desc":null,"values":null},{"name":"F04-PGA-S10","desc":"Acta preconstrucción","values":null},{"name":"F37-PGA-S10","desc":"Plan de inversión del anticipo","values":null},{"name":"F09-PGA-S10","desc":"Acta de vecindad","values":null},{"name":"F05-PGA-S10","desc":"Acta de inicio","values":null},{"name":"F01-PGA-S10","desc":"Desembolso de anticipo","values":null}] 

am I何かを見逃したり、何か間違っている?

答えて

6

MVC4スティルはBrad Christie氏が述べたように、JavaScriptSerializerを使用しています。そのため、Json.Netでオブジェクトをシリアライズするには、いくつかの手順を実行する必要があります。

まず、以下のように(this solutionに基づく)化するJsonResultから新しいクラスJsonNetResult継承:

protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) 
{ 
    return new JsonNetResult(data, contentType, contentEncoding, behavior); 
} 
+0

この回答がまだ関連しているかどうかわかりませんが、このようなものが必要でしたし、コードのc/pを実行しました。残念ながら期待通りに機能しませんでしたが、あなたのJsonNetResultクラスを少し編集しました:var serializedObject = JsonConvert.SerializeObject(Data、Formatting.None、new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}); ...そして今、それは完全に動作します。ありがとう! – robertpaulsen

0

私の提案はあなただけでJSONに1つのGanttEventオブジェクトをシリアル化とどうなるか見てだろう。また、Jsonへの電話が適切であることを確認してください。

1

Controller.Jsonは、(JsonPropertyAttributeが由来する)ではなく、JavaScriptSerializerを使用します。

Newtonsoftライブラリライブラリを使用してシリアル化された結果を返すか、Jsonを呼び出して、nullを無視するconverterを書き込む必要があります。

+0

public class JsonNetResult : JsonResult { public JsonNetResult() { this.ContentType = "application/json"; } public JsonNetResult(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior jsonRequestBehavior) { this.ContentEncoding = contentEncoding; this.ContentType = !string.IsNullOrWhiteSpace(contentType) ? contentType : "application/json"; this.Data = data; this.JsonRequestBehavior = jsonRequestBehavior; } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); var response = context.HttpContext.Response; response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data == null) return; // If you need special handling, you can call another form of SerializeObject below var serializedObject = JsonConvert.SerializeObject(Data, Formatting.None); response.Write(serializedObject); } } 

次に、あなたのコントローラでは、新しいクラスを使用するには、JSONのメソッドをオーバーライドしますありがとう、私はそれについて疑いがあり、私の考えを確認した。結局のところ、Json.Netはデフォルトのシリアライザですが、** WebAPI **では通常のMVCサイトではありません。 – Farlop

関連する問題