以下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);
还有其他办法吗?
答案 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);
}
}
}
这有帮助吗?