如何使用从JSON字符串反序列化的嵌套元素数组

时间:2014-11-10 22:36:42

标签: c# json

以下JSON字符串将进入MVC操作:

[{"id":13},{"id":14},{"id":15,"children":[{"id":16},{"id":17},{"id":18}]}]

我使用DeserializeObject类的JavaScriptSerializer方法反序列化JSON字符串,但我不确定在反序列化后如何使用转换后的数组。

var result = Request["nestable-output"];                       

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
var answer = json_serializer.DeserializeObject(result);

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

当您在DeserializeObject()类上调用JavaScriptSerializer时,序列化程序没有任何关于要反序列化的对象类型的提示,而不是它可以从JSON结构推断出的内容。因此,当它看到JSON数组时,它将使用object[],当它看到JSON对象时,它将使用Dictionary<string, object>。了解这一点,您可以通过在需要的地方进行投射来获取数据:

foreach (Dictionary<string, object> item in (IEnumerable)answer)
{
    Console.WriteLine("id: " + item["id"]);
    if (item.ContainsKey("children"))
    {
        Console.WriteLine("children:");
        foreach (Dictionary<string, object> child in (IEnumerable)item["children"])
        {
            Console.WriteLine("   id: " + child["id"]);
        }
    }
}

但是有更好的方法。如果可能,通常最好定义一些强类型类并反序列化。例如,对于您的JSON,我们可以创建一个Item类,如下所示:

class Item
{
    public int Id { get; set; }
    public List<Item> Children { get; set; }
}

然后,我们可以使用Deserialize<T>()方法代替DeserializeObject()。现在显而易见的是数据的类型,我们可以像任何其他对象一样轻松地使用它。

List<Item> answer = json_serializer.Deserialize<List<Item>>(result);

foreach (Item item in answer)
{
    Console.WriteLine("id: " + item.Id);
    if (item.Children != null)
    {
        Console.WriteLine("children:");
        foreach (Item child in item.Children)
        {
            Console.WriteLine("   id: " + child.Id);
        }
    }
}

这有帮助吗?