【问题标题】:Deserialize JSON with JavaScriptSerializer使用 JavaScriptSerializer 反序列化 JSON
【发布时间】:2011-05-09 13:19:55
【问题描述】:

我构建了一个导航树并使用这个函数将结构保存在一个数组中

function parseTree(html) {
   var nodes = [];
   html.parent().children("div").each(function () {
      var subtree = $(this).children("div");
      var item = $(this).find(">span");
      if (subtree.size() > 0)
          nodes.push([item.attr("data-pId"), item.attr("data-id"), parseTree(subtree)]);
      else
          nodes.push(item.attr("data-pId"), item.attr("data-id"));
  });
  return nodes;
}

然后我序列化数据

var tree = $.toJSON(parseTree($("#MyTree").children("div")));

获取这个数组

[
    ["881150024","881150024",
        [
         "994441819","881150024",
         "214494418","881150024"
        ]
    ],
    ["-256163399","-256163399",
        [
            "977082012","-256163399",
            "-492694206","-256163399",
            [
                "1706814966","-256163399",
                    ["-26481618","-256163399"]
            ]
        ]
    ]
]

并通过ajax发送

             $.ajax({
                url: "Editor/SerializeTree",
                type: "POST",
                data: { tree: tree },
                success: function (result) {
                    alert("OK");
                }
            });

问题:如何在 C# 中使用 JavaScriptSerializer 反序列化这个 JSON?

【问题讨论】:

    标签: c# json serialization deserialization


    【解决方案1】:

    这里看起来你有一个节点数组,每个节点都有一组字符串或另一个节点数组,对吧?您可以做的第一件事就是将其反序列化为 List<object>,如下所示:

    string treeData = "..."; // The JSON data from the POST
    JavaScriptSerializer js = new JavaScriptSerializer();
    List<object> tree = js.Deserialize <List<object>>(treeData);
    

    这会将您的 JSON 转换为对象列表,尽管您需要手动确定什么是什么(如果每个对象都是字符串或另一个 List&lt;object&gt;)。

    不过,一般来说,使用某种类或结构来表示您提供给序列化程序的数据的“模式”会有所帮助,但这比上述工作要多一些。

    在这种情况下,您需要输入数据是一个实际的 JSON 对象,而不仅仅是一个数组。假设你有这个 JSON(基于上述数据):

    {id: "root", children: [
      {id: "881150024"},
      {id: "881150024", children: [
        {id: "994441819"}, {id: "881150024"}]},
        {id: "-256163399"},
        {id: "-256163399", children: [            
        {id: "-492694206"},
          {id: "-256163399", children: [
            {id: "1706814966"},
            {id: "-256163399", children: [
              {id: "-26481618"}, {id: "-256163399"}]}
    ]}]}]}
    

    如果你有这样的课程:

    public class Node
    {
      public String id;
      public List<Node> children;
    }
    

    然后您可以执行以下操作:

    string treeData = "..."; // The JSON data from the POST
    JavaScriptSerializer js = new JavaScriptSerializer();
    Node root = js.Deserialize<Node>(treeData);
    

    这将更容易在代码中使用。

    【讨论】:

    • 描述得很好!我使用了第二种解决方案。我只需要修复这一行 List root = js.Deserialize>(tree);非常感谢。这是我的第一个反序列化脚本 :-)
    【解决方案2】:

    考虑到@_rusty 的回答。

    在 MVC3 中,可以将 JSON 数据绑定到操作中,因此您的控制器代码将非常简单

    [HttpPost]
    public void SerializeTree(IList<Node> tree)
    {
        // tree is deserialized JSON here
    }
    

    【讨论】:

    • 谢谢亚历山大!我现在使用 MVC2。当我将它更新到第 3 版时,我会尝试这个漂亮的解决方案。 :-)
    • @podeig,我不会等待 :) 并使用 MvcFutures 来获得所需的解决方案。很简单很漂亮,看看这个haacked.com/archive/2010/04/15/…
    【解决方案3】:

    对于我们中少数仍在使用 VB.Net 的人来说:

    Imports System.Web.Script.Serialization
    
    'wsvcResponse<string> contains the following JSON object: { "foo":"bar", "foo2": { "bar2": "foobar" } }
    Dim jsSerializer As New JavaScriptSerializer()
    Dim jsonObject As List(Of Object) = jsSerializer.Deserialize(Of Object)(wsvcResponse)
    Dim foo As String = jsonObject("foo").ToString  ' "bar"
    Dim bar2 As String = jsonObject("foo2")("bar2").ToString ' "foobar"
    

    【讨论】:

    • 真正的新手问题 - 在Dim jsonObject As List(Of Object) 中,我是用我创建的类替换Object,还是将其保留为Object
    • 我正在使用通用 Object 类(这对我来说很少见,因为我通常使用显式类型)主要是因为我找不到更好的方法来获取 Deserialize() 方法的结果.我最初的直觉是:“.Deserialize(Of List(of string))(wsvcResposne) 但我无法按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2021-09-02
    • 2015-01-11
    相关资源
    最近更新 更多