Сериализация JSON, возвращая ключи, в которых есть тире? - PullRequest
3 голосов
/ 17 марта 2011

Я хотел бы вернуть 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 для этого. Но это слишком много для такого простого желания.

Я мог бы также заставить клиента массировать ключи для меня, как только он получит данные, но я также надеюсь избежать этого. В целом, я бы предпочел просто не следовать стандартам, чем любой из этих обходных путей.

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

Вы можете использовать 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);
}
2 голосов
/ 17 марта 2011

Я обнаружил, что JavaScriptSerializer, который использует JsonResult, имеет специальный случай для словарей. Так что, если вы просто сделаете:

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

Тогда полученный JSON будет в нужном формате.

...