2015-11-03 2 views
8

Sto testando la mia API Web. Beffardo i dati ho questo:Impossibile eseguire il cast dell'oggetto di tipo 'Newtonsoft.Json.Linq.JObject' per digitare 'Newtonsoft.Json.Linq.JArray'

var objs = ((JArray)JsonConvert.DeserializeObject("{ \"PrintId\":10,\"Header\":\"header\",\"TC\":\"tc\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}")).Values<JObject>(); 

Il che mi dà l'errore:

Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'Newtonsoft.Json.Linq.JArray'

Il fatto è che si stava lavorando. Devo aver cambiato qualcosa, ma non so cosa.

Il mio intento è quello di convertire questo oggetto JSON a un elenco di oggetti .NET chiamati Print che ha i campi:

PrintId 
Header 
TX 
CompnayRef 
+3

La risposta è semplice. Non è un array. È un oggetto e tu provi a lanciarlo su un array. –

+0

Non c'è niente di sbagliato nel codice * this * - il testo json è * non * un array, è un dizionario. Se pensavi che funzionasse prima, il testo era diverso o il cast. –

+2

Il codice che hai fornito era decisamente * non * funzionante per lo stesso JSON. –

risposta

21

Basta fare un corso e deserializzare.

public class Print 
{ 
    public int PrintId { get; set; } 
    public string Header { get; set; } 
    public string TC { get; set; } 
    public string CompanyRef { get; set; } 
} 

Print printObj = JsonConvert.DeserializeObject<Print>(yourJson); 
printObj.PrintId = //... 
+0

Se dire che Print aveva un sub-oggetto che era un arraylist, come lo avresti deserializzato in modo che l'arraylist non fosse ancora in formato json? –

+0

@CBC_NS Proprio come faresti ora, aggiungi la proprietà alla classe di stampa (come 'public List PropertyName {get; set;}') e deserializza come descritto. – Camo

+0

@Rinecamo Stai dicendo di deserializzare ciascun sottooggetto come se fosse l'oggetto principale; Non posso deserializzare contemporaneamente gli oggetti padre e figlio? –

5

Come dice il messaggio, l'oggetto è JObject quindi non gettarlo ai JArray . Prova questo:

var objs = JsonConvert.DeserializeObject("{ \"PrintId\":10,\"Header\":\"header\",\"TC\":\"tc\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}"); 

Aggiornamento Per ottenere una raccolta List<Print>, il vostro JSON deve essere un array. Prova questo (ho fatto il tuo JSON un array e ha aggiunto un secondo oggetto):

string json = "[{ \"PrintId\":10,\"Header\":\"header\",\"TC\":\"tc\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}" 
      + ",{ \"PrintId\":20,\"Header\":\"header2\",\"TC\":\"tc2\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}]"; 
var objs = JsonConvert.DeserializeObject<List<Print>>(json); 

//The loop is only for testing. Replace it with your code. 
foreach(Print p in objs){ 
    Console.WriteLine("PrintId: " + p.PrintId); 
    Console.WriteLine("Header: " + p.Header); 
    Console.WriteLine("TC: " + p.TC); 
    Console.WriteLine("CompanyRef: " + p.CompanyRef); 
    Console.WriteLine("=============================="); 
} 

public class Print 
{ 
    public int PrintId { get; set; } 
    public string Header { get; set; } 
    public string TC { get; set; } 
    public string CompanyRef { get; set; } 
} 

Ecco un fiddle.

+1

È già * un JObject *, questo è ciò di cui parla il messaggio di errore –

+0

Sì, ho dimenticato di eliminarlo alla fine della riga. Provalo ora. –

+0

Ciao, non si tratta di errori questa volta, ma come faccio a inserirli nella mia collezione ? –