Il metodo di estensione JObject.ToObject () trasforma i valori datetime memorizzati come stringhe

Quando si chiama ToObject su JObject con una proprietà stringa, trasforma il valore datetime.

class Program { static void Main(string[] args) { var a = JObject.Parse("{\"aprop\":\"2012-12-02T23:03:31Z\"}"); var jobject = a.ToObject(); Console.ReadKey(); } } public class A { public string AProp { get; set; } } 

Il problema è che ottengo il mio valore trasformato nonostante sia una stringa. I caratteri specifici ISO8601 sono saltati:

inserisci la descrizione dell'immagine qui

Prevedo che non si verifichino trasformazioni e voglio essere in grado di fare personalmente la validazione della data e la creazione specifica per la cultura. Ho anche provato il prossimo codice senza successo:

 var jobject = a.ToObject(new JsonSerializer { DateParseHandling = DateParseHandling.None }); 

JObject.Parse viene introdotto per l’esempio. Nel mio vero compito ho un’azione Web.Api su un controller:

 public HttpResponseMessage Put(JObject[] requestData) { var jobject = a.ToObject(); return SomeCleverStaffResponse(); } 

quello che vuoi è

 using Newtonsoft.Json; class Program { static void Main(string[] args) { var temp = JsonConvert.DeserializeObject("{\"aprop\":\"2012-12-02T23:03:31Z\"}"); Console.ReadKey(); } } 

non appena esegui Parse poiché “2012-12-02T23: 03: 31Z \” è una data in cui il parser crea un object Date, dopo tutto questo avrà già analizzato l’object in modo che .ToObject sia inutile in quanto ciò che stai facendo sta andando dalla data alla stringa ed è per questo che ottieni il “12 / …”.

Perché lo analizzi , quando non vuoi che sia analizzato, in primo luogo? Non c’è alcun motivo per JObject un’istanza di JObject . JsonSerializer.Deserialize semplicemente la stringa utilizzando il JsonSerializer.Deserialize direttamente in un’istanza A È quindi ansible sfruttare tutti gli attributi di Json.NET (tra gli altri mezzi) per controllare la deserializzazione come si desidera.