2011-03-17 57 views
3

我想從我的控制器返回JSON,這是從匿名類型生成的,並且在鍵名中包含破折號。這可能嗎?JSON序列化,返回其中有破折號的密鑰?

所以,如果我有這樣的:

public ActionResult GetJSONData() { 
    var data = new { DataModifiedDate = myDate.ToShortDateString() }; 
    return Json(data); 
} 

在客戶端,我想它是這樣到達連載:

{ "data-modified-date" : "3/17/2011" } 

我對想這個原因是這樣的JSON數據最終將成爲DOM節點上的屬性,我想玩得很好,並使用新的HTML5數據屬性。我只能返回{ modifieddate: "3/17/2011" }並以這種方式使用它,但如果我能夠更符合標準,我願意。

我明白,如果我編寫自己的JsonResult類使用非匿名類型的WCF JSON序列化器,我可以使用DataMemberAttribute來完成此操作。但是,對於這樣一個簡單的願望,這是一個很大的開銷。

我也可以讓客戶端爲我按摩鑰匙,一旦它收到數據,但我希望也能避免。總而言之,我寧可不遵循標準,也不願意採用這些解決方法。

回答

4

你可以使用Json.NET,並已超過屬性名稱完全控制:

public ActionResult GetJSONData() 
{ 
    var obj = new JObject(); 
    obj["data-modified-date"] = myDate.ToShortDateString(); 
    var result = JsonConvert.SerializeObject(obj); 
    return Content(result, "application/json"); 
} 

顯然這段代碼是尖叫着通過引入自定義操作結果加以改進:

public class JsonNetResult : ActionResult 
{ 
    private readonly JObject _jObject; 
    public JsonNetResult(JObject jObject) 
    { 
     _jObject = jObject; 
    } 

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

然後:

public ActionResult GetJSONData() 
{ 
    var obj = new JObject(); 
    obj["data-modified-date"] = myDate.ToShortDateString(); 
    return new JsonNetResult(obj); 
} 
+0

這並不壞。我還發現,字典也可以在一個捏。 – 2011-03-17 18:23:38

+0

現在,我正在與我的字典黑客攻擊,因爲它與我已經有的事情。但我更喜歡你的答案,因爲它不涉及任何黑客或內部知識。我可能最終會用這樣的解決方案。 – 2011-03-17 18:26:45

2

我找到了JavaScriptSerializer,JsonResult我們es有一個字典的特例。所以,如果你只是這樣做:

​​

然後生成的JSON是在所需的格式。

+1

這應該是被接受的答案 – jnoreiga 2013-04-01 14:04:42