ASP.NET WebAPI JSON Binding Case-Sensitivity

L’aggiornamento da Beta WebAPI di ASP.NET a RC ha fornito un po ‘di entusiasmo e molta frustrazione. Sono stato in grado di lavorare attraverso la maggior parte dei problemi, ma quello che mi sta mordendo in questo momento è la case-sensitivity dei dati delle richieste JSON.

Il formattatore utilizzato per le richieste JSON (che per impostazione predefinita è un formattatore JSON.NET) sembra distinguere tra maiuscole e minuscole mentre il formatter utilizzato per i dati con urlencoded del modulo non lo fa. C’è un modo per configurare le richieste JSON per usare un formattatore senza distinzione tra maiuscole e minuscole?

Ecco un semplice esempio per illustrare il problema che sto riscontrando con le richieste JSON:

HTML / 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("

Success

"); }, 400: function () { $("body").append("

Failure

"); } } }).always(function () { $("body").append("
"); }); }); });

C #

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

Ho fornito un commento sulla riga in cui vengono forniti i dati JSON. Preferirei non infrangere le convenzioni con i miei oggetti JavaScript da parte dei membri della proprietà del case appropriato e certamente non voglio rompere le convenzioni abbassando le proprietà del mio C #. qualche idea?

Il formattatore Json.NET non fa distinzione tra maiuscole e minuscole per la deserializzazione (json -> CLR).

In caso di serializzazione, è ansible ottenere l’involucro del cammello utilizzando CamelCasePropertyNamesContractResolver .

Nel tuo Global.asax:

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

Dopo aver approfondito questo problema in modo significativo, mi sono reso conto che stavo colpendo un bug nel convertitore KeysonValuePair di Json.NET. James Newton-King è stato così gentile da rispondere alla mia domanda correlata e ha fornito un link alla correzione:

Deserializzazione proprietà insensibili alle maiuscole di JSON.NET