1. ホーム
  2. asp.net-mvc

[解決済み] [Solved] ASP.NET MVCコントローラメソッドからJSON.NETでシリアライズされたcamelCase JSONを返すにはどうすればよいですか?

2022-04-17 11:30:12

質問内容

私の問題は、キャメルケースの(標準のパスカルケースとは対照的な)JSONデータを アクション結果 でシリアライズされ、ASP.NET MVCコントローラのメソッドから出力されます。 JSON.NET .

例として、次のようなC#のクラスを考えてみましょう。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

デフォルトでは、このクラスのインスタンスを MVC コントローラから JSON として返す場合、以下のような方法でシリアライズされます。

{
  "FirstName": "Joe",
  "LastName": "Public"
}

として(JSON.NETで)シリアライズしてほしい。

{
  "firstName": "Joe",
  "lastName": "Public"
}

どうすればいい?

どのように解決するのですか?

この問題に対する優れた解決策を、Mats Karlssonの ブログ . この解決策は、JSON.NETを介してデータをシリアライズするActionResultのサブクラスを書き、後者がキャメルケースの規則に従うように設定することです。

public class JsonCamelCaseResult : ActionResult
{
    public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior)
    {
        Data = data;
        JsonRequestBehavior = jsonRequestBehavior;
    }

    public Encoding ContentEncoding { get; set; }

    public string ContentType { get; set; }

    public object Data { get; set; }

    public JsonRequestBehavior JsonRequestBehavior { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.");
        }

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data == null)
            return;

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings));
    }
}

そして、このクラスをMVCコントローラのメソッド内で以下のように使用します。

public ActionResult GetPerson()
{
    return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)};
}