19

ASP.NET WebAPI Beta から RC へのアップグレードは、ある程度の興奮と大きなフラストレーションをもたらしました。私は問題の大部分を解決することができましたが、今私を悩ませているのは、JSON 要求データの大文字と小文字の区別です。

JSON 要求に使用されるフォーマッター (デフォルトでは JSON.NET フォーマッター) は大文字と小文字を区別しているように見えますが、フォーム urlencoded データに使用されるフォーマッターはそうではありません。大文字と小文字を区別しないフォーマッタを使用するように JSON 要求を構成する方法はありますか?

JSON リクエストで発生している問題を説明する簡単な例を次に示します。

HTML / JavaScript

<button id="tester">Click here!</button>

<script type="text/javascript">
    $(function () {
        $("#tester").on("click", function() {
            $.ajax({
                type: "POST",
                url: "/Api/Test/Index/" + 168,
                data: ko.toJSON({ key: 123, value: "test value" }), // THIS FAILS
                               // Key: 123, Value: "test value" <- BUT THIS WORKS
                contentType: "application/json; charset=utf-8",
                statusCode: {
                    200: function () {
                        $("body").append("<p>Success</p>");
                    },
                    400: function () {
                        $("body").append("<p>Failure</p>");
                    }
                }
            }).always(function () {
                $("body").append("<hr />");
            });
        });
    });
</script>

C#

public class TestController : ApiController
{
    public HttpResponseMessage Index(int? id, KeyValuePair<int, string> test)
    {
        if (id != 168 || test.Key != 123 || test.Value != "test value")
            return Request.CreateResponse(HttpStatusCode.BadRequest);

        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

JSON データが提供されている行にコメントを付けました。プロパティ メンバーを適切に大文字にすることで JavaScript オブジェクトの規則を破りたくないし、C# プロパティを小文字にすることで規則を破ることは絶対にしたくありません。何かご意見は?

4

2 に答える 2

25

Json.NET フォーマッターは、逆シリアル化 (json -> CLR) で大文字と小文字を区別しません。

シリアル化では、 CamelCasePropertyNamesContractResolver を使用してキャメルケースを取得できます。

Global.asax で:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
于 2012-06-29T17:48:36.457 に答える