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 に答える