繁体   English   中英

在ASP.net C#中从JSON检索数组

[英]Retrieving an array from JSON in ASP.net C#

我正在从Web API收集数据,该Web API返回复杂的JSON字符串。 它包含许多不同类型的值,一些数组和一些相当深的嵌套。

目前,我正在将字符串转换为动态对象,如下所示:

dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString);

然后,根据需要从该对象中检索值并进行类型转换,但是当我尝试检索数组时,此方法给出了空引用异常:

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

由于我对C#和ASP.net相当陌生,因此我不确定该如何进行。 到目前为止,我遇到的大多数解决方案都需要创建小型的,类型严格的类,这些类反映整个JSON结构。 就我而言,最好使用一个动态对象,部分是为了简单起见,部分是因为实际上只使用了某些值。

当我尝试运行您的代码时,出现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之所以有效,是因为为许多类型(包括int )定义了强制转换,但int[]却没有。

您可以使用ToObject<type>扩展方法(其中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

另一种可能性是将对象JObjectJObject ,然后将数组作为属性获取-检索到的对象自动为JToken类型,从而允许迭代:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM