2012-06-29 23 views
17

ASP.NET WebAPIベータからRCへのアップグレードは、多少の興奮と大きな不満をもたらしました。私は大部分の問題を解決することができましたが、今私を噛んでいるのはJSON要求データの大文字と小文字を区別することです。ASP.NET WebAPI JSONバインディング大文字と小文字の区別

JSONリクエスト(デフォルトではJSON.NETフォーマッタ)で使用されるフォーマッタは、フォームURLコード化データに使用されるフォーマッタが大文字と小文字を区別するように見えます。大文字と小文字を区別しないフォーマッタを使用するように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#のプロパティを下げることで規約を破ってはいけません。何かご意見は?

+0

を。 POSTリクエスト内で、つまり要求本体内でデータを送信します。しかし、HTTPドキュメントでは、ヘッダーフィールド(と値)は大文字と小文字を区別しないとみなされ、本文については何もありません。なぜフォームurlencodedデータの動作ではないと思いますか? – raina77ow

+0

[このディスカッション](http://groups.google.com/group/soundcloudapi/browse_thread/thread/c266c0d2efa88fbb/9ad3969dde919cba)を確認してください。 – raina77ow

+1

@ raina77owこれは実際にはHTTP仕様ではなく、ASP.NET WebAPI RCで使用されるJSON.NETフォーマッタの動作です。 FormUrlフォーマッタは大文字と小文字を区別しないように見えますが、JSON.NETフォーマッタは大文字と小文字を区別します。 –

答えて

6

重要な深さでこの問題を掘り下げる後、私は私がJson.NET KeyValuePairコンバータのバグを打ったことを実感するようになりました。ジェームズ・ニュートン・キングは親切にも私の関連質問に答えることだったと修正へのリンクを提供:私はここで少し混乱している

Json.NET Case-insensitive Property Deserialization

24

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

シリアル化では、CamelCasePropertyNamesContractResolverを使用してラクダケーシングを作成できます。あなたのGlobal.asaxで

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
+0

私はこれが事実であると信じていましたが、私はその行動を証明することができませんでした。私の関連する質問を参照してください:http://stackoverflow.com/questions/11266695/json-net-case-insensitive-property-deserialization –

+0

うーん...私はちょうどJsonConvertを試してみました。デシリアライズするKeyValuePair は大文字と小文字を区別しますが、私がPOCOを作成した場合、その動作は大文字と小文字を区別しません。私はsetterでKeyValuePairの独自のバージョンを定義していたので、getterを持つがsetterは持たないKeyValuePairに関連しているようだ。 –

+0

ああ、あなたは何かをしているかもしれません...私はさらに実験を行い、一致したキーを使ってどのように脱直列化しているのか判断できるかどうかを見ていきます。ありがとう! –

関連する問題