[英]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類。 我沒有得到這個工作。
這是另一種選擇。 請注意,這可能不被視為最佳方法。 但這很簡單:
使用要在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
}
這是我的解決方案:
首先,我創建一個節點類,其中包含我想要的節點數據結構,以及一個將對象序列化的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());
我希望這有幫助
使用自定義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.