我必须使用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对象的最简单方法是什么?
答案 0 :(得分:1)
您需要添加以递归方式从每个节点生成JSON的方法。
答案 1 :(得分:0)
我遇到了同样的问题:只有顶级节点使用标准的JSON.Net Serializer导出,因为正如上面链接中的fero正确地指出的那样,“你的TreeNode类被序列化为一个数组,因为它实现了IEnumerable”。它进一步说你应该使用JsonConverterAttribute修饰TreeNode类。我没有让它发挥作用。
这是另一种选择。请注意,这可能不被视为最佳方式。但这很简单:
使用您要在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)
这是我的解决方案:
首先,我创建一个节点类,其中包含我想要的节点数据结构,以及一个序列化对象的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);
}
}
}
我编写了一种方法,该方法旨在递归调用。返回给定特定树节点的子节点列表
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;
}
我编写并更新了对象方法,以创建一个根节点,其中可以包含树视图的所有节点。我决定使用根节点而不是节点列表,因为列表中没有用于序列化对象的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);
}
根对象必须声明为单个节点
private node root;
您只需调用root的JSon方法
MessageBox.show(root.JSon());
我希望这对您有帮助
答案 3 :(得分:0)
使用自定义json序列化程序对我有用
ssh