2015-11-03 22 views
8

Web API'mı test ediyorum. Verileri alaycı bu var:'Newtonsoft.Json.Linq.JArray' türünde nesne yazmak için 'Newtonsoft.Json.Linq.JArray'

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

:

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

şey çalışıyordu olduğunu. Bir şeyi değiştirmiş olmalıyım ama ne olduğunu bilmiyorum. senin nesne JObject yüzden JArray için döküm vermezken,

PrintId 
Header 
TX 
CompnayRef 
+3

Yanıt basittir. Bu bir dizi değil. Bu bir nesnedir ve onu bir diziye çevirmeye çalışırsınız. –

+0

* Bu * kodu ile yanlış olan hiçbir şey yok - json metni * bir * dizi değil, bir sözlük. Daha önce çalışmış olduğunu düşündüğünüzde, metin farklıydı ya da yayınlandı. –

+2

Sağladığınız kod kesinlikle aynı * JSON için * çalışmıyor. –

cevap

21

Sadece bir sınıf oluşturun ve seri hale getirin.

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

Eğer Print, bir arraylist olan bir alt nesneye sahip olsaydı, arraylistin hala json formatında olmaması için nasıl seri hale getirirsin? –

+0

@CBC_NS Hemen şimdi yaptığınız gibi, özelliği yazdırma sınıfına ekleyin ("public List PropertyName {get; set;}" gibi) ve açıklanan şekilde seri hale getirin. – Camo

+0

@Rinecamo Her bir alt nesneyi üst nesneye atadığınız gibi seri hale getiriyor musunuz? Ebeveyn ve çocuk nesnelerini bir seferde kaldıramaz mıyım? –

5

mesajı dediği gibi:

Benim niyet alanları olan Print denilen NET nesneler listesi için bu JSON nesnesi dönüştürmek olduğunu . Bu deneyin:

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

Güncelleme bir koleksiyon List<Print> almak için JSON bir dizi olması gerekiyor. Bu (Ben senin JSON bir dizi yapılmış ve ikinci bir nesne eklendi) deneyin:

İşte
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; } 
} 

bir fiddle olduğunu.

+1

* Zaten bir JObject *, bu hata iletisinin hakkında konuşuyor –

+0

Evet, hattın sonunda onu silmek unuttum. Şimdi dene. –

+0

Merhaba, bu sefer hata yapmıyor ancak List koleksiyonuma nasıl ulaşırım? –

İlgili konular