2014-05-20 59 views
1

我从一个Web API收集数据,该API返回一个复杂的JSON字符串。这包含许多不同类型的值,一些数组和一些相当深的嵌套。从ASP.net中的JSON检索数组C#

目前我的字符串转换为动态对象,像这样:从该对象

dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString); 

然后我检索值根据需要和他们类型转换,但此方法对一个空引用异常,当我试图检索一个数组:

int myValue   = (int)dynamicObject.foo.value; // Works! 
int[] myArrayOfInts = (int[])dynamicObject.bar.values; // Null 

我不知道如何继续,因为我相当新的C#和ASP.net。到目前为止,我所遇到的大多数解决方案都需要创建反映整个JSON结构的小型,严格类型的类。在我的情况下,最好简单地使用动态对象,部分原因是为了简单,部分原因是实际上只使用了某些值。

+1

围绕你说“不起作用”的部分,你应该解释一些不适合你的实际行为。有抛出异常吗?构建错误?这就是你从一个体面的可通过性问题中失去的一切。 – clarkitect

+0

该数组未初始化;它给出一个空引用异常。对不起,不清楚,我会将其添加到问题。 –

回答

4

当我尝试运行你的代码时,我得到了一个RuntimeBinderException: Cannot convert type 'Newtonsoft.Json.Linq.JArray' to 'int[]'。您可以使用ToObject进行此转换。

dynamic dynamicObject = JsonConvert.DeserializeObject("{\"values\": [1, 3, 4]}"); 
int[] myArrayOfInts = dynamicObject.values.ToObject<int[]>(); 

演员到int作品,因为铸造转化率的定义for many types包括int,但不int[]

+0

Thankyou,这是产生所需的结果。 –

2

你可以使用ToObject<type>扩展方法(其中类型是所需的数据类型)反序列化数组:

var jsonString = @"{ ""name"":""test"", ""array"": [""10"",""20"",""30"",""40""] }"; 
dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString); 
Console.WriteLine(((string)dynamicObject.name)); 
var items = dynamicObject.array.ToObject<int[]>(); 
foreach (var item in items) 
{ 
    Console.WriteLine(item); 
} 

的输出是:

test 
10 
20 
30 
40 

另一种可能性是把对象到JObject,然后获取数组作为属性 - 检索到的对象自动键入JToken,允许迭代:

var array = ((JObject)dynamicObject)["array"]; 
foreach (var item in array) 
{ 
    Console.WriteLine(item.ToString()); 
}