2015-11-03 101 views
8

我正在測試我的Web API。嘲諷數據我有這樣的:無法投射'Newtonsoft.Json.Linq.JObject'類型的對象來鍵入'Newtonsoft.Json.Linq.JArray'

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'

的事情是它的工作。我必須改變一些東西,但我不知道是什麼。

我的意圖是這個JSON對象轉換成所謂的Print .NET對象的列表,它具有以下字段:

PrintId 
Header 
TX 
CompnayRef 
+3

答案很簡單。它不是一個數組。它是一個對象,並且您嘗試將其轉換爲數組。 –

+0

* this * code沒有問題 - json文本是* not *數組,它是一個字典。如果你以前認爲它是有效的,那麼文本是不同的或者是演員。 –

+2

您提供的代碼絕對*不*適用於相同的JSON。 –

回答

21

只要創建一個類並反序列化它。

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

如果說,打印有一個子對象是一個數組列表,你將如何反序列化,以便數組列表不是仍然在JSON格式? –

+0

@CBC_NS就像你現在要做的那樣,將屬性添加到打印類(如'public List PropertyName {get; set;}'),並按照描述進行反序列化。 – Camo

+0

@Rinecamo你是說反序列化每個子對象,就像你將父對象一樣;我無法一次反序列化父對象和子對象? –

5

由於有消息稱,您的目標是JObject所以不要將其轉換爲JArray 。試試這個:

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

更新爲了獲得一個collection List<Print>,你的JSON必須是一個數組。試試這個(我做你的JSON數組,並添加了第二個對象):

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; } 
} 

這裏是一個fiddle

+1

它已經是一個JObject *了,這就是錯誤信息正在談論的內容 –

+0

是的,我忘了在行尾刪除它。現在就試試。 –

+0

嗨,這次沒有錯誤,但我怎樣才能將它收錄到我的清單集合中? –

相關問題