2016-09-20 30 views
0

由於種種原因,我從ASP.NET MVC 的內置JSON序列(即返回低於System.Web.Mvc.JsonResult對象(見編輯的一個交換))到Newtonsoft。直到我開始測試前,我才意識到前者返回JavaScript對象字面值,而Newtonsoft返回JSON格式的字符串返回JavaScript對象字面,沒有JSON字符串,從ASP.NET MVC端點

我喜歡不必在客戶端解析JSON字符串 - 它已經作爲一個對象字面很方便 - 但我想堅持使用Newtonsoft出於其他技術原因。

例如,而不是看到我的客戶對這個結果......

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

...我希望看到這樣的結果:

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

有沒有一種方法,使Newtonsoft返回JS對象文字而不是字符串?

編輯

我的問題被陷害的方式並不是最好的。 JsonResult類型沒有問題。事實上,解決方案仍然使用它。唯一的問題是默認的Controller.Json方法,它可以被覆蓋以使用Newtonsoft(Json.NET)而不是內置的序列化程序。

+0

我不熟悉.NET世界 - 是服務器上的Newtonsoft嗎?因爲如果是這樣,你永遠不能從服務器返回一個JS文字。無論如何,都不在網絡請求中。或者當它呈現時嵌入頁面的某個地方? – vlaz

+0

你不能用JSON.Parse(響應)編輯你的JS文件嗎? –

+1

你是如何創建你的JSON響應並使用Json.Net從MVC返回它們的? –

回答

1

只要寫一個使用Newtonsoft串行定製JsonResult:

沿着東西線:

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

信用:https://gist.github.com/jpoehls/1424538

+0

這是完美的!我最終通過使用'response.Write(JsonConvert.SerializeObject(this.Data))'而不是'JsonTextWriter'和'JsonSerializer'來實現更簡單的版本。我永遠不需要使用任何特殊的'JsonSerializerSettings'或'Formatting',並且與作家一起工作總是讓我覺得過於複雜。 –

0

答案就在這裏:How to force ASP.NET Web API to always return JSON?

摘錄:

全部清除格式化,並添加Json的格式化回來。

GlobalConfiguration.Configuration.Formatters.Clear(); GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter()); 編輯

我將它添加到Application_Start()中的Global.asax中。

+0

我沒有使用Web API。我的控制器上的端點包括ViewResults,Json字符串和文件結果,所以我不認爲這對我有用。 –