2012-12-03 14 views
37

Sto usando la libreria JSON Newtonsoft per eseguire la deserializzazione dinamica su JSON raw in arrivo e ho trovato qualcosa che non riesco a spiegare.Newtonsoft JSON - Dynamic Objects

Il punto di partenza è la seguente stringa JSON:

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

Niente di troppo complesso si ...

Nel codice che sto poi facendo questo:

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

Questo codice è stato sul posto per mesi e funziona bene, tuttavia in un recente build di test abbiamo riscontrato il seguente errore:

'Newtonsoft.Json.Linq.JObject' does not contain a definition for 'task'

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

Ora, questo è dove si ottiene strano, tutto comincia a lavorare di nuovo se cambio il codice di cui sopra da:

DateTime dueDate = dyn.task.dueDate.Value; 

a

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

Quindi, anche se questo è "fisso" I non capisco perché questo lo risolva e quale potrebbe essere la possibile causa. Qualcuno ha qualche idea

+0

Hai cambiato la versione di Json.NET che stai utilizzando? –

+0

No, questo è stato il mio primo pensiero: guardare la cronologia delle modifiche sia sul codice che sulla libreria non mostra alcuna modifica di ciò che è in (e funzionante) in diretta – MrEyes

+4

Sei sicuro che questa non sia una "prima eccezione casuale" - tipica per dinamica (forse hai aumentato il livello di dettagli nel tuo errore di accesso, ecc.)? – tpeczek

risposta

41

Si può provare questo:

dynamic task = JObject.Parse(rawJson); 

Documentazione: Querying JSON with dynamic

+0

funziona alla grande, mi chiedo perché non è la risposta accettata. – Saturnix

+11

Perché sta chiedendo di capire perché non funziona nell'esempio fornito, perché * dovrebbe * funzionare per l'esempio fornito. –

+1

Questo non lo risolve per me, lo stesso errore. – Ted

1

questo è sicuramente qualche problema riferimento, ho appena avuto lo stesso problema, si è rivelato il problema era che avevo aggiunta la cartella dei pacchetti al progetto in modo che potessi verificarlo in VSS (scusate, obbligatorio), non appena ho rimosso la cartella dei pacchetti da Visual Studio, ha iniziato a funzionare bene

+2

VSS ... Ahi! Mi dispiace saperlo. –

1

Ho avuto lo stesso problema con un'app u canta 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.

+0

Questo era lo stesso problema per me! –

5

Nel mio caso è risultato 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 oggetto 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.

4

Ho avuto lo stesso problema.

Json.NET 6.0.4 causa questo problema. È necessario modificarlo in Json.Net 6.0.5. Nessuno del progetto deve fare riferimento a Json.NET 6.0.4.

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

+0

Per la cronologia, lo stesso problema con Json.NET 6.0.3. Risolto l'ultima versione 7.0.1. –

+2

Come parte interessante, ho scaricato il sorgente Newtonsoft.JSON e ho fatto una ricerca su "task". Il JSON grezzo esatto degli OP viene inserito in un metodo di prova ... chissà perché questo si è verificato ma qualcuno in Newtonsoft ha letto questo. Sembra che la linea di fondo sia che questo è (o era) un bug con la libreria. – RLH

+0

Ho questo problema in v 7.0.0.0 sembra ... – Ted

1

Ho avuto questo problema per un po ', risulta che la DLL utilizzata è stata compilata per .NET 3.5 che non supportava la dinamica .... Assicurati che la tua DLL sia compilata per .NET 4.5 e successivi

Problemi correlati