【问题标题】:Retrieving an array from JSON in ASP.net C#在 ASP.net C# 中从 JSON 检索数组
【发布时间】:2014-05-20 18:34:49
【问题描述】:

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

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

dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString);

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

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

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

【问题讨论】:

  • 就在您说“不起作用”的部分附近,您可能应该解释对您不起作用的实际行为。是否抛出异常?构建错误?这就是一个体面的--可回答-- 问题所缺少的全部内容。
  • 数组未初始化;它给出了一个空引用异常。抱歉,不清楚,我将其添加到问题中。

标签: c# asp.net json json.net


【解决方案1】:

当我尝试运行您的代码时,我得到一个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[]

【讨论】:

  • 谢谢,这正在产生预期的结果。
【解决方案2】:

您可以使用ToObject&lt;type&gt; 扩展方法对数组进行反序列化(其中 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());
}

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2017-02-25
    • 1970-01-01
    相关资源
    最近更新 更多