我想从我的控制器返回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 Serializer,我可以使用DataMemberAttribute
来完成此任务。但对于这样一个简单的愿望来说,这是一个很大的开销。
我也可以让客户在收到数据后为我按键,但我也希望避免这样做。总而言之,我宁愿不遵循标准而不是其中任何一种解决方法。
答案 0 :(得分: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);
}
答案 1 :(得分:2)
我发现JsonResult使用的JavaScriptSerializer具有Dictionaries的特殊情况。所以如果你这样做:
var data = new Dictionary<string, string>
{
{ "data-modified-date", myDate.ToShortDateString() }
};
然后生成的JSON采用所需的格式。