2012-11-08 11 views
8

Ich habe eine Aktion, die ein JsonResult für ein Objekt einer bestimmten Klasse zurückgibt. Ich habe die Eigenschaften dieser Klasse mit einigen Attributen dekoriert, um Nullfelder zu vermeiden. Klassendefinition ist:MVC4 Aktion, die JsonResult ohne Null zurückgibt

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

Und in meiner Aktion verwende ich ein Objekt

var res = new List<GanttEvent>(); 

die kehre ich mit:

return Json(res, JsonRequestBehavior.AllowGet); 

Unfortunatelly, ich bin immer noch NULL-Werte am Ausgang empfangen:

[{"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}] 

Bin ich etwas vermissen oder etwas falsch machen?

Antwort

6

Wie von Brad Christie angegeben, verwendet MVC4 stills JavaScriptSerializer. Um also Ihr Objekt von Json.Net serialisieren zu lassen, müssen Sie mehrere Schritte ausführen.

zunächst eine neue Klasse JsonNetResult von JsonResult erben als (basierend auf this solution) folgt:

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

Dann außer Kraft setzen in Ihrem Controller, die Json Methode, um die neue Klasse zu verwenden:

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

Ich weiß nicht, ob diese Antwort noch relevant ist, aber ich brauchte so etwas und machte einen c/p Code. Leider hat es nicht wie erwartet funktioniert, aber ich habe Ihre JsonNetResult-Klasse leicht bearbeitet: var serializedObject = JsonConvert.SerializeObject (Daten, Formatierung.Nein, neue JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}); ... und jetzt funktioniert es perfekt. Vielen Dank! – robertpaulsen

0

Mein Vorschlag wäre zu sehen, was passiert, wenn Sie nur ein GanttEvent-Objekt zu JSON serialisieren. Überprüfen Sie auch Ihren Anruf zu Json ist angemessen.

1

Controller.Json verwendet die JavaScriptSerializer nicht die Newtonsoft Json library (von wo stammt die JsonPropertyAttribute stammt).

Sie müssen entweder die Newtonsoft-Bibliotheksbibliothek verwenden und das serialisierte Ergebnis auf diese Weise zurückgeben, oder Sie rufen weiterhin Json an und schreiben eine converter, die Nullen ignoriert.

+0

Danke, ich war misstrauisch, und du hast meine Meinung bestätigt. Am Ende ist Json.Net der Standard-Serializer, aber nur für ** WebAPI **, nicht für normale MVC-Site. – Farlop

Verwandte Themen