2016-09-20 5 views
0

Aus verschiedenen Gründen, die ich von ASP.NET MVC gebaut in JSON Serializer eingeschaltet haben ( derjenige, der ein zurück System.Web.Mvc.JsonResult Objekt(siehe bearbeiten unten)) zu Newtonsoft. Ich erkannte erst, nachdem ich mit dem Testen begonnen hatte, dass die erste ein JavaScript-Objektliteral zurückgibt, während Newtonsoft eine JSON-formatierte -Zeichenfolge zurückgibt.Return JavaScript Objektliteral, nicht JSON-String, von ASP.NET MVC Endpunkt

Ich mag es nicht, JSON-Strings auf der Client-Seite zu analysieren - es als Objekt-Literal ist sehr praktisch - aber ich möchte aus anderen technischen Gründen bei Newtonsoft bleiben.

Zum Beispiel, anstatt dieses Ergebnis zu sehen, auf meinem Klienten ...

"{"Errors":["Please enter a valid email address."],"HasErrors":true}" 

... Ich möchte dieses Ergebnis sehen:

{"Errors":["Please enter a valid email address."],"HasErrors":true} // no quotes 

Gibt es eine Möglichkeit zu machen Newtonsoft gibt JS-Objektliterale anstelle von Zeichenfolgen zurück?

EDIT

Die Art und Weise meine Frage eingerahmt wurde, war nicht die beste. Mit dem Typ JsonResult ist nichts falsch. Tatsächlich verwendet die Lösung es immer noch. Das einzige Problem war die Standardmethode Controller.Json, die überschrieben werden kann, um Newtonsoft (Json.NET) anstelle des integrierten Serialisers zu verwenden.

+0

Ich bin nicht so vertraut mit der .NET-Welt - ist Newtonsoft auf dem Server? Denn in diesem Fall sollten Sie niemals ein JS-Literal vom Server zurückgeben können. In einer Netzwerkanfrage sowieso nicht. Oder ist das irgendwo in der Seite eingebettet, wenn es gerendert wird? – vlaz

+0

Können Sie Ihre JS-Datei nicht mit einem JSON.Parse (Antwort) bearbeiten? –

+1

Wie erstellen Sie Ihre JSON-Antworten und geben sie mit Json.Net von MVC zurück? –

Antwort

1

Schreiben Sie einfach eine benutzerdefinierte JsonResult die Newtonsoft Serializer verwendet:

Etwas entlang der Linien:

public abstract class BaseController : Controller 
{ 
    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding) 
    { 
     return new JsonNetResult 
     { 
      ContentType = contentType, 
      ContentEncoding = contentEncoding, 
      Data = data 
     }; 
    } 

    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) 
    { 
     return new JsonNetResult 
        { 
         ContentType = contentType, 
         ContentEncoding = contentEncoding, 
         Data = data, 
         JsonRequestBehavior = behavior 
        }; 
    } 
} 

JsonNetResult.cs:

using System; 
using System.Web; 
using System.Web.Mvc; 
using Newtonsoft.Json; 

public class JsonNetResult : JsonResult 
{ 
    public JsonSerializerSettings SerializerSettings { get; set; } 
    public Formatting Formatting { get; set; } 

    public JsonNetResult() 
    { 
     Formatting = Formatting.None; 
     SerializerSettings = new JsonSerializerSettings(); 
     JsonRequestBehavior = JsonRequestBehavior.DenyGet; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     if (JsonRequestBehavior == JsonRequestBehavior.DenyGet 
      && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
     { 
      throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet."); 
     } 

     HttpResponseBase response = context.HttpContext.Response; 

     response.ContentType = !string.IsNullOrEmpty(ContentType) 
            ? ContentType 
            : "application/json"; 

     if (ContentEncoding != null) 
      response.ContentEncoding = ContentEncoding; 

     if (Data != null) 
     { 
      var writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; 

      var serializer = JsonSerializer.Create(SerializerSettings); 
      serializer.Serialize(writer, Data); 

      writer.Flush(); 
     } 
    } 
} 

Credit: https://gist.github.com/jpoehls/1424538

+0

Das ist perfekt! Ich habe eine noch einfachere Version implementiert, indem ich 'response.Write (JsonConvert.SerializeObject (this.Data))' anstelle von 'JsonTextWriter' und' JsonSerializer' verwendet habe. Ich werde nie irgendwelche speziellen 'JsonSerializerSettings' oder' Formatierungen' brauchen, und die Arbeit mit Autoren erscheint mir immer als übermäßig kompliziert. –

0

Antwort ist hier: How to force ASP.NET Web API to always return JSON?

Auszug:

Löschen Sie alle Formatierer und Json Formatierer wieder hinzufügen.

GlobalConfiguration.Configuration.Formatters.Clear(); GlobalConfiguration.Configuration.Formatters.Add (neuer JsonMediaTypeFormatter()); EDIT

Ich habe es Global.asax in Application_Start() hinzugefügt.

+0

Ich verwende keine Web-API. Die Endpunkte auf meinem Controller umfassen ViewResults, Json-Strings und Dateiergebnisse, also glaube ich nicht, dass dies für mich funktionieren würde. –

Verwandte Themen