簡體   English   中英

使用C#將Treeview轉換為JSON

[英]Convert a Treeview to JSON using C#

我必須使用C#將TreeView對象轉換為JSON。 我目前正在使用JsonConvert.SerializeObject()

public class SubTreeNode : TreeNode
{
    public CustomProperties customProperties;
}

public class CustomProperties
{

    public string property1 = "Property1";
    public string property2 = "Property2";
    public string property3 = "Property3";
}

當嘗試使用JsonConvert.SerializeObject(treeView1.Nodes); 它僅返回頂部節點,而不返回子節點,子子節點等。

序列化和反序列化此TreeView對象的最簡單方法是什么?

您將需要添加從每個節點遞歸生成JSON的方法。

查看相關文章: 將樹序列化為Json Object

我遇到了同樣的問題:只有頂部節點才使用標准JSON.Net序列化程序導出,這是因為,正如上述鏈接正確地聲明,“您的TreeNode類被序列化為數組,因為它實現了IEnumerable”。 進一步說,您應該使用JsonConverterAttribute裝飾TreeNode類。 我沒有得到這個工作。

這是另一種選擇。 請注意,這可能不被視為最佳方法。 但這很簡單:

  • 您正在使用標准TreeNode類,並且您的數據存儲在TreeView中
  • 您要使用JSON.NET序列化器

使用要在JSON中導出的信息創建一個新的層次結構類(在我的情況下,我只想導出我的treenode-properties的一部分,因此創建一個新的簡單類有意義兩次):

'Simplified version of tree for json
'Compared to TreeNode class, this object is also serializable with the standard JSON.NET Serializer
Public Class JTree
    Public children As New List(Of JTree)()
    Private _name As String
    Public Property name() As String
        Get
            Return _name
        End Get
        Set(value As String)
            _name = value
        End Set
    End Property
    Private _id As String
    Public Property id() As String
        Get
            Return _id
        End Get
        Set(value As String)
            _id = value
        End Set
    End Property
End Class

將數據從TreeView遞歸移動到新的JTree(我們的自定義類):

Public Sub createSimplifiedJSONTree(parentNode As TreeNode, ByRef JTreeSimp As JTree)
    'Start recursion on all subnodes
    For Each childNode As TreeNode In parentNode.Nodes
        Dim jchild As New JTree
        jchild.id = childNode.Name
        jchild.name = childNode.Text
        JTreeSimp.children.Add(jchild)
        createSimplifiedJSONTree(childNode, jchild)
    Next
End Sub

使用JSON.NET Serializer將簡化的JSON樹寫入文件:

Private Sub WriteJSONfromTreeview()
    Dim rootNode As TreeNode = TreeView1.Nodes(0)
    Dim JTreeSimp As New JTree
    createSimplifiedJSONTree(rootNode, JTreeSimp)

    'serialize JSON directly to a file using JSON.Net Serializer
    Using file__1 As StreamWriter = File.CreateText("c:\temp\test.txt")
        Dim serializer As New JsonSerializer()
        serializer.Formatting = Formatting.Indented
        serializer.Serialize(file__1, JTreeSimp)
    End Using
End Sub

最終文本(示例):

{
  "children": [    
    {
      "children": [
        {
          "children": [
            {
              "children": [
                {
                  "children": [
                    {
                      "children": [
                        {
                          "children": [
                            {
                              "children": [],
                              "name": "alcatraz",
                              "id": "021_3",
                              "size": 166
                            }
                          ],
                          "name": "skyline",
                          "id": "031_3",
                          "size": 167
                        }
                      ],
                      "name": "city",
                      "id": "041_5",
                      "size": 167
                    }
                  ],
                  "name": "coit",
                  "id": "051_4",
                  "size": 169
                }
              ],
              "name": "tower",
              "id": "061_3",
              "size": 170
            }
          ],
          "name": "telegraphhill",
          "id": "071_3",
          "size": 170
        }
      ],
      "name": "coittower",
      "id": "081_2",
      "size": 170
    },   
    {
      "children": [
        {
          "children": [],
          "name": "sunset",
          "id": "071_112",
          "size": 3
        }
      ],
      "name": "berkeley",
      "id": "081_109",
      "size": 3
    },
    {
      "children": [
        {
          "children": [],
          "name": "marin",
          "id": "071_77",
          "size": 3
        }
      ],
      "name": "marinheadlands",
      "id": "081_110",
      "size": 3
    }
  ],
  "name": "root",
  "id": "000",
  "size": 0
}

這是我的解決方案:


  1. 首先,我創建一個節點類,其中包含我想要的節點數據結構,以及一個將對象序列化的JSon方法

     [JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)] private class node { public node() { this.children = new List<node>(); } public node(string _value, List<node> _children = null, bool _isChecked = false) { Value = _value; isChecked = _isChecked; if (_children != null) { children = _children; } } [JsonProperty("value")] public string Value { get; set; } [JsonProperty("isChecked")] public bool isChecked { get; set; } [JsonProperty("children", NullValueHandling = NullValueHandling.Ignore)] public List<node> children { get; set; } [JsonIgnore] public string JSon { get { return JsonConvert.SerializeObject(this); } } } 

  1. 我編寫了一種方法,該方法旨在遞歸調用。 返回給定特定樹節點的子節點列表

      private List<node> RunNode(TreeNode node) { List<node> nodeOut = new List<node>(); foreach(TreeNode child in node.Nodes) { List<node> grandchild = RunNode(child); nodeOut.Add(new node(child.Text, grandchild, child.Checked)); } return nodeOut; } 

  1. 我編寫並更新了對象方法,以創建一個根節點,其中可以包含樹視圖的所有節點。 我決定使用根節點而不是節點列表,因為列表中沒有用於序列化對象的JSon方法。

     private void ActualizarMenus() { List<node> parents= new List<node>(); foreach (TreeNode node in trw.Nodes) { List<node> childs = RunNode(node); parents.Add(new node(node.Text,childs,node.Checked)); } root = new node("root", parents, true); } 
  2. 根對象必須聲明為單個節點

     private node root; 

    你可以調用root的JSon方法

     MessageBox.show(root.JSon()); 

我希望這有幫助

使用自定義json序列化器對我有用

var settings = new JsonSerializerSettings
                {
                    Converters = new List<JsonConverter> { new OrgChartConverter() },
                    Formatting = Formatting.Indented
                };

                string json = JsonConvert.SerializeObject(tree, settings);

public class OrgChartConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(Node<T>).IsAssignableFrom(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Node<T> node = (Node<T>)value;
        JObject obj = new JObject();
        obj.Add("Name", node.Value.Name);
        obj.Add("Children", JArray.FromObject(node.Children, serializer));
        obj.WriteTo(writer);
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM