使用C#将Treeview转换为JSON

时间:2016-02-08 17:11:24

标签: c# json treeview json.net

我必须使用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对象的最简单方法是什么?

4 个答案:

答案 0 :(得分:1)

您需要添加以递归方式从每个节点生成JSON的方法。

查看相关帖子:Serializing a Tree into Json Object

答案 1 :(得分:0)

我遇到了同样的问题:只有顶级节点使用标准的JSON.Net Serializer导出,因为正如上面链接中的fero正确地指出的那样,“你的TreeNode类被序列化为一个数组,因为它实现了IEnumerable”。它进一步说你应该使用JsonConverterAttribute修饰TreeNode类。我没有让它发挥作用。

这是另一种选择。请注意,这可能不被视为最佳方式。但这很简单:

  • 您正在使用标准TreeNode类,并且您的数据存储在TreeView
  • 您想使用JSON.NET Serializer

使用您要在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

最终的txt(示例):

{
  "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
}

答案 2 :(得分: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());
    

我希望这对您有帮助

答案 3 :(得分:0)

使用自定义json序列化程序对我有用

ssh