JSON序列化,返回其中包含破折号的键?

时间:2011-03-17 18:01:29

标签: asp.net-mvc json asp.net-mvc-3 custom-data-attribute

我想从我的控制器返回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来完成此任务。但对于这样一个简单的愿望来说,这是一个很大的开销。

我也可以让客户在收到数据后为我按键,但我也希望避免这样做。总而言之,我宁愿不遵循标准而不是其中任何一种解决方法。

2 个答案:

答案 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采用所需的格式。