3

我想从我的控制器返回 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

2 回答 2

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);
}
于 2011-03-17T18:17:34.873 回答
2

我发现 JsonResult 使用的 JavaScriptSerializer 对字典有特殊情况。所以,如果你这样做:

var data = new Dictionary<string, string> 
{
     { "data-modified-date", myDate.ToShortDateString() }
};

然后生成的 JSON 采用所需的格式。

于 2011-03-17T18:25:31.007 回答