2011-08-15 12 views
61

Sto usando System.Web.Helpers.Json per deserializzare alcuni JSON in dynamic in NET 4 . La riga seguente non riesce con questo errore: TypeInitializationException: Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed.Tentativo di metodo 'System.Web.Helpers.Json..cctor()' per accedere al metodo 'System.Web.Helpers.Json.CreateSerializer()' fallito

var json = Json.Decode(response); 

Il response è lunga, ma valida JSON. Che cosa potrebbe essere il problema qui? Ho provato LINQPad con un breve JSON artigianale e ha funzionato. Si tratta di un problema di configurazione di qualche tipo?

[EDIT]

Ecco il JSON campione reale. Sembra che il contenuto sia praticamente irrilevante. Quando viene eseguito in una nuova applicazione Console o LINQPad, funziona come previsto. Ma se si tenta di eseguire lo stesso codice da una nuovissima applicazione Windows Form, si blocca con l'errore sopra riportato.

var json = Json.Decode("{\"r\":{\"0\":{\"id\":\"2\"},\"1\":{\"id\":\"33\"}}}"); 

[EDIT2]

Actually, it turns out questo has nothing a fare con types project. L'eccezione viene generata se il progetto è in fase di debug. Se è semplicemente eseguito, l'eccezione non si verifica. Strano, eh?

+1

Mostrare il JSON e il codice che si sta utilizzando per deserializzare. – casperOne

+1

Ho modificato la domanda per includere un JSON di esempio e una descrizione aggiuntiva su come riprodurre. – wpfwannabe

+1

Esiste una InnerException per 'TypeInitializationException'? Potrebbe darti maggiori informazioni su ciò che è fallito. – akton

risposta

137

Ho dimenticato questa domanda e nel frattempo ho trovato la mia risposta. Penso che sia da qualche parte sul sito di Microsoft Connect, ma non ne sono sicuro. Quindi condividiamolo ora.

In sostanza, per risolvere questo problema è necessario assicurarsi che "Abilita il processo di hosting di Visual Studio" è deselezionato nelle impostazioni del progetto in Debug. Non sono sicuro del motivo per cui sta accadendo, ma questo è sicuramente un modo per "risolverlo". Ho smesso di cercare risposte una volta scoperto questo. E 'stato abbastanza buono per me.

Settings/Debug

+0

grande che contrassegnarlo come una risposta e ottenere bounty :) –

+2

Non sono sicuro che sia appropriato. È solo la mia chiamata? Penso che chiunque offra taglie abbia diritto a questo (o sbaglio?). – wpfwannabe

+0

@wpfwannabe per favore, aggiungi il tuo commento di risposta che questa opzione deve essere deselezionata per qualsiasi progetto che fa riferimento al progetto originale con il codice "Json.Decode". – Seekeer

7

Questo può succedere anche se si esegue in un trust parziale. Controllare lo exception description here per possibili motivi.

Non so se questo si applica a voi, dal momento che non è in esecuzione in un contesto web, ma questo è quello che puntano descrive:

This exception is thrown in situations such as the following:

  • A private, protected, or internal method that would not be accessible from normal compiled code is accessed from partially trusted code by using reflection.

  • A security-critical method is accessed from transparent code.

  • The access level of a method in a class library has changed, and one or more assemblies that reference the library have not been recompiled.

3

non v'è problema nella classe JSON integrato.

Se si vuole raggiungere questo obiettivo in modo alternativo, si prega di utilizzare il codice qui sotto:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
serializer.RegisterConverters(new DynamicJavaScriptConverter[] { new DynamicJavaScriptConverter() }); 
var result = WrapObject(serializer.DeserializeObject(value)); // here you will have result. 

private object WrapObject(object value) 
    { 
     IDictionary<string, object> values = value as IDictionary<string, object>; 
     if (values != null) 
     { 
      return new DynamicJsonObject(values); 
     } 
     object[] arrayValues = value as object[]; 
     if (arrayValues != null) 
     { 
      return new DynamicJsonArray(arrayValues); 
     } 
     return value; 
    } 
+0

'DynamicJavaScriptConverter' nel .Net Framework? Dove? – dumbledad

1

seguito alla risposta di Roland: alcuni disallineamenti di assemblaggio elencati possono essere fissati nel file AssemblyInfo.cs.

La linea incriminata nel mio AssemblyInfo è stato questo:

[assembly: AllowPartiallyTrustedCallers] 

La rimozione di questo mi ha permesso di accedere alla proprietà pubblica (su una classe pubblica) che stavo cercando di impostare da un altro assembly che aveva caricato in modo dinamico questa assemblea .

Problemi correlati