Newtonsoft JSON – Oggetti dinamici

Sto usando la libreria JSON di Newtonsoft per eseguire la deserializzazione dynamic su JSON raw in arrivo e ho trovato qualcosa che non riesco a spiegare.

Il punto di partenza è la seguente stringa JSON:

{ "task": { "dueDate": "2012-12-03T00:00:00" } } 

Niente di troppo complesso lì …

Nel codice sto quindi facendo questo:

 var dyn = JsonConvert.DeserializeObject(rawJson); DateTime dueDate = dyn.task.dueDate.Value; 

Questo codice è in vigore da mesi e funziona bene, tuttavia in una recente build del test abbiamo riscontrato il seguente errore:

‘Newtonsoft.Json.Linq.JObject’ non contiene una definizione per ‘task’

Stack Trace: su CallSite.Target (Closure, CallSite, Object) su System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0, TRet] (sito CallSite, T0 arg0)

Ora questo è dove è strano, tutto inizia a funzionare di nuovo se cambio il codice sopra da:

 DateTime dueDate = dyn.task.dueDate.Value; 

a

 DateTime dueDate = dyn["task"]["dueDate"].Value; 

Quindi, anche se questo è “risolto”, non capisco perché questo lo risolva e quale possa essere la causa ansible. Qualcuno ha qualche idea

Puoi provare questo:

 dynamic task = JObject.Parse(rawJson); 

Documentazione: interrogazione di JSON con dynamic

Nel mio caso si è scoperto che stavo rilevando le eccezioni di prima scelta, quindi sebbene questa eccezione fosse stata lanciata, in realtà non impediva l’esecuzione del mio codice.

Sarebbe comunque bello sapere perché questo accade per alcuni contenuti deserializzati da Json.NET, ma non tutti i contenuti. Ad esempio, ho un object dinamico che serializzo con json.net in un test unitario, quindi deserializza il contenuto serializzato. Il contenuto serializzato è identico al contenuto che, in fase di runtime, causa il lancio di eccezioni del raccoglitore di runtime.

Ho avuto lo stesso problema.

Json.NET 6.0.4 causa questo problema. Dovresti cambiarlo in Json.Net 6.0.5. Nessuno del progetto dovrebbe fare riferimento a Json.NET 6.0.4.

Vai su Strumenti -> Gestore pacchetti NuGet -> Gestisci pacchetti NuGet per la soluzione … e verifica, se uno qualsiasi dei progetti utilizza Json.NET 6.0.4, correggili.

Questo è sicuramente un problema di referenziazione, ho appena avuto lo stesso problema, ho scoperto che avevo aggiunto la cartella dei pacchetti al progetto in modo che potessi verificarlo in VSS (mi dispiace, obbligatorio), non appena ho rimosso il cartella dei pacchetti da Visual Studio, ha iniziato a funzionare bene

Ho avuto questo problema in corso per un po ‘, risulta che la DLL utilizzata è stata compilata per .NET 3.5 che non supportava la dynamic …. Assicurati che la tua DLL sia compilata per .NET 4.5 e versioni successive

Ho avuto lo stesso problema con un’app che utilizza Json.NET. Il problema si ripresentava solo su una macchina specifica e si è scoperto che la macchina disponeva di un’altra versione di Json.NET installata in GAC. Dopo averlo rimosso da GAC, l’app ha iniziato a funzionare correttamente.