Deserializzazione di JSON in un object

Ho un po ‘di JSON:

{ "foo" : [ { "bar" : "baz" }, { "bar" : "qux" } ] } 

E voglio deserializzare questo in una collezione. Ho definito questa class:

 public class Foo { public string bar { get; set; } } 

Tuttavia, il seguente codice non funziona:

  JsonConvert.DeserializeObject<List>(jsonString); 

Come posso deserializzare il mio JSON?

Quel JSON non è un array di Foo JSON. Il codice JsonConvert.DeserializeObject(jsonString) analizzerà la stringa JSON dalla radice in su e il tipo T deve corrispondere esattamente alla struttura JSON. Il parser non intende indovinare quale membro JSON dovrebbe rappresentare l’ List che stai cercando.

È necessario un object radice, che rappresenta il JSON dall’elemento radice.

Puoi facilmente consentire alle classi di essere generate da un JSON di esempio. Per fare ciò, copia il tuo JSON e fai clic su Edit -> Paste Special -> Paste JSON As Classes in Visual Studio.

In alternativa, puoi fare lo stesso su http://json2csharp.com , che genera più o meno le stesse classi.

Vedrai che la raccolta è in realtà un elemento più profondo del previsto:

 public class Foo { public string bar { get; set; } } public class RootObject { public List foo { get; set; } } 

Ora puoi deserializzare il JSON dalla radice (e assicurati di rinominare RootObject con qualcosa di utile):

 var rootObject = JsonConvert.DeserializeObject(jsonString); 

E accedi alla collezione:

 foreach (var foo in rootObject.foo) { // foo is a `Foo` } 

Puoi sempre rinominare le proprietà per seguire la tua convenzione di custodia e applicare loro un attributo JsonProperty :

 public class Foo { [JsonProperty("bar")] public string Bar { get; set; } } 

Assicurati inoltre che il JSON contenga abbastanza dati di esempio. Il parser della class dovrà indovinare il tipo C # appropriato in base ai contenuti trovati nel JSON.