Проанализируйте json, созданный jstree в C#

#c# #json #jstree #json-deserialization

Вопрос:

В настоящее время я получаю следующую строку массива, сгенерированного из jsTree:

 "[
   {
      "id":"j1_1",
      "text":"Root node 1",
      "icon":true,
      "li_attr":{
         "id":"j1_1"
      },
      "a_attr":{
         "href":"#",
         "id":"j1_1_anchor"
      },
      "data":{
         
      },
      "children":[
         {
            "id":"j1_2",
            "text":"Child 1",
            "icon":true,
            "li_attr":{
               "id":"j1_2"
            },
            "a_attr":{
               "href":"#",
               "id":"j1_2_anchor"
            },
            "data":{
               
            },
            "children":[
               
            ]
         }
      ]
   }
]"
 

Я пытаюсь десериализовать следующий элемент с помощью

 JsTreeModel aaa = Newtonsoft.Json.JsonConvert.DeserializeObject<JsTreeModel>(json);
 

С JsTreeModel, являющимся этим классом:

     public class JsTreeModel
    {
        [JsonProperty("id")]
        public string id { get; set; }

        [JsonProperty("text")]
        public string text { get; set; }

        [JsonProperty("icon")]
        public string icon { get; set; }

        [JsonProperty("li_attr")]
        public string li_attr { get; set; }

        [JsonProperty("a_attr")]
        public string a_attr { get; set; }

        [JsonProperty("data")]
        public string data { get; set; }
    }
 

Но я получаю ошибку`:

 Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'AccesosWeb.Entidad.JsTree.JsTreeModel' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
 

Я думаю, что проблема в том, как структурирован класс, но я не знаю, как его построить.

Комментарии:

1. Внимательно прочитайте сообщение и посмотрите на свой JSON. Обратите внимание, как ваш JSON начинается и заканчивается на a [ и a ] ? Что это значит? Это означает, что это коллекция , массив. Итак, что вы должны десериализовать в C#? Коллекция ! Например: список, массив и т. Д. Во что вы сейчас десериализуетесь? Какой-то предмет . JsTreeModel является объектом , что означает, что он соответствует JSON, который начинается { и заканчивается } .

2. Как написал @Llama — ваш json-это массив, поэтому попробуйте DeserializeObject<List<JsTreeModel>>(json) вместо этого.

3. Спасибо вам обоим. После изменения его в список возникла еще одна ошибка при попытке прочитать такие поля, как li_attr , поэтому я также структурировал класс, аналогичный решению Леандро Барделли, приведенному ниже, чтобы добавить сущности для правильного представления данных json. (За исключением того, что мне пришлось внести некоторые исправления, так как он неправильно представлял его в том виде, в каком он его опубликовал).

Ответ №1:

Это модель, которая вам нужна с учетом json, который вы вставляете:

Вы можете использовать основной объект:

 JsTreeModel myDeserializedClass = JsonConvert.DeserializeObject<JsTreeModel>(json);
 

и объект является:

 public class JsTreeModel 
{
    public List<MyArray> MyArray { get; set; }
}

public class LiAttr
{
    public string id { get; set; }
}

public class AAttr
{
    public string href { get; set; }
    public string id { get; set; }
}

public class Data
{
}

public class Child
{
    public string id { get; set; }
    public string text { get; set; }
    public bool icon { get; set; }
    public LiAttr li_attr { get; set; }
    public AAttr a_attr { get; set; }
    public Data data { get; set; }
    public List<object> children { get; set; }
}

public class MyArray
{
    public string id { get; set; }
    public string text { get; set; }
    public bool icon { get; set; }
    public LiAttr li_attr { get; set; }
    public AAttr a_attr { get; set; }
    public Data data { get; set; }
    public List<Child> children { get; set; }
}