2012-09-19 60 views
3

我有一個操作在我的ASP.Net MVC4應用程序中返回JsonResult。我將Data屬性設置爲預定義類的數組。我的問題是我想序列化不同的屬性名稱。無論使用什麼屬性,該對象都會使用預定義的屬性名稱進行序列化。我試過沒有結果如下:使用JsonResult時定義JSON字段名稱

[DataMember(Name = "iTotalRecords")] 
[JsonProperty(PropertyName = "iTotalRecords")] 
public int TotalRecords { get; set; } 

我知道「iTotalRecords」似乎很傻,但這個動作是用於支持jQuery插件,預計「iTotalRecords」,而不是「總記錄」。當然,我想使用在我的代碼隱藏中有意義的名稱。

什麼序列化器用於分析JsonResult?有什麼我可以做或我必須重新考慮返回JsonResult作爲一個行動結果?

+1

你見過[這個線程](http://stackoverflow.com/questions/1302946/asp-net-mvc-controlling-serialization-of-property-names-with-jsonresult)? –

回答

4

用什麼序列化器來分析JsonResult?

JavaScriptSerializer

有什麼我可以做或我必須重新考慮返回JsonResult作爲一個行動結果?

兩種可能性浮現在腦海中:

  • 定義視圖模型,然後你的域模型映射到視圖模型
  • 編寫使用Json.NET或DataContractJsonSerializer並允許自定義操作結果您可以控制序列化屬性的名稱。 following question說明了這一點。
3

感謝您的建議。我繼續創建了使用Json.Net一個ActionResult:

public class JsonNetActionResult : ActionResult 
{ 
    public Object Data { get; private set; } 

    public JsonNetActionResult(Object data) 
    { 
     this.Data = data; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.ContentType = "application/json"; 
     context.HttpContext.Response.Write(JsonConvert.SerializeObject(Data)); 
    } 
} 

僅供參考,它看起來像Json.Net尊重都[數據成員]和[JsonProperty],而[JsonProperty]將王牌[數據成員]如果有差別。

+0

我喜歡這個!您應該添加一個例子使用'公共虛擬的ActionResult GetByCatalogId(GUID採用catalogId){VAR O =新的MyObject();返回新的JsonNetActionResult(o); }' – styfle

1

我已經找到了解決方案的一部分here和SO

public class JsonNetResult : ActionResult 
    { 
     public Encoding ContentEncoding { get; set; } 
     public string ContentType { get; set; } 
     public object Data { get; set; } 

     public JsonSerializerSettings SerializerSettings { get; set; } 
     public Formatting Formatting { get; set; } 

     public JsonNetResult(object data, Formatting formatting) 
      : this(data) 
     { 
      Formatting = formatting; 
     } 

     public JsonNetResult(object data):this() 
     { 
      Data = data; 
     } 

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

     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; 

      var writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; 
      var serializer = JsonSerializer.Create(SerializerSettings); 
      serializer.Serialize(writer, Data); 
      writer.Flush(); 
     } 
    } 

所以,在我的控制,我可以做到這一點

 return new JsonNetResult(result); 

在我的模型,我現在可以有:

[JsonProperty(PropertyName = "n")] 
    public string Name { get; set; } 

請注意,現在您必須將JsonPropertyAttribute設置爲您要序列化的每個屬性。

相關問題