【问题标题】:How to work with a nested array of elements deserialized from a JSON string如何使用从 JSON 字符串反序列化的嵌套元素数组
【发布时间】:2014-11-10 22:36:42
【问题描述】:

以下 JSON 字符串将出现在 MVC 操作中:

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

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

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

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

还有其他方法吗?

【问题讨论】:

  • 你有没有用谷歌对此进行过简单的搜索..?实际上有很多关于如何在SO 上执行此操作的示例/答案,请在Deserializing a JSON String 上表现出更多的努力@
  • 个人没有得到 cmets 的积分,而 cmets 不是答案.. 看看这个也许你需要遵循一些例子tomasvera.com/programming/…

标签: c# json


【解决方案1】:

当您在 JavaScriptSerializer 类上调用 DeserializeObject() 时,序列化程序除了可以从 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&lt;T&gt;() 方法代替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);
        }
    }
}

这有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多