Десериализовать JSON с помощью JavaScriptSerializer - PullRequest
4 голосов
/ 09 мая 2011

Я строю дерево навигации и сохраняю структуру, используя эту функцию в массиве

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");
                }
            });

Вопрос: Как десериализовать этот JSON с помощью JavaScriptSerializer в C #?

Ответы [ 3 ]

11 голосов
/ 09 мая 2011

Здесь кажется, что у вас есть массив узлов, и у каждого узла есть набор строк или другой массив узлов, верно?Первое, что вы можете сделать, это просто десериализовать это в List<object> примерно так:

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

Это превратит ваш JSON в список объектов, хотя вам нужно будет вручную выяснить, что к чему(если каждый объект является строкой или другим List<object>).

Обычно, однако, полезно иметь некоторый класс или структуру для представления "схемы" для данных, которые вы предоставляете сериализатору, ноэто немного больше работы, чем выше.

В этом случае вам нужно, чтобы ваши входные данные были реальным объектом 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);

С этим будет намного проще работать в коде.

1 голос
/ 21 марта 2014

Для тех немногих из нас, кто все еще использует 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"
1 голос
/ 09 мая 2011

С учетом ответа @ _rusty.

В MVC3 можно объединять данные JSON в действия, поэтому код вашего контроллера будет очень простым

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