2015-11-03 170 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

嗨,这次没有错误,但我怎样才能将它收录到我的清单集合中? –

相关问题