C#父子ID的表数据转换成Tree型Json数据

C#父子ID的表数据转换成Tree型Json数据

2023年6月22日发(作者:)

C#⽗⼦ID的表数据转换成Tree型Json数据C#⽗⼦ID的表数据转换成Tree型Json数据在开发中有许多需要⽣成树型JSON数据的情况,⽐如侧边栏菜单、组织结构等,下⾯为两种JSON格式的数据⽣成⽅法。1.现在有这样字段的⽗⼦结构的表public class Node{ ///

/// id /// public int id { get; set; } /// /// 上级id /// public int pid { get; set; } public string text { get; set; }}2.⽣成第⼀种格式的树型JSON字符串:JSON数据[ { "id":1, "pid":0, "text":"节点1", "children":[ { "id":2, "pid":1, "text":"节点1->2", "children":[ { "id":4, "pid":2, "text":"节点1->2->4", "children":[] }, { "id":5, "pid":2, "text":"节点1->2->5", "children":[] } ] }, { "id":3, "pid":1, "text":"节点1->3", "children":[ ] } ] }, { "id":6, "pid":0, "text":"节点6", "children":[ { "id":7, "pid":6, "text":"节点6->7", "children":[ { "id":8, "pid":7, "text":"节点6->7->8", "children":[] } ] } ] }]⽅案⼀:使⽤泛型,通过反射⽣成IEnumerable对象,再进⾏序列化(1). 实现///泛型K为pid的数据类型public static IEnumerable GetChildrenTreeNode(IEnumerable notes, Func idSelector, Func parentIdSelector, K rootId = default(K)) where T : class { var dView = (x => { K pid = parentIdSelector(x); return (rootId == null && pid == null) || (rootId != null && (rootId)); }); // List objList = new List(); foreach (var dr in dView) { var testType = typeof(T); var propertyInfos = perties(ce | | lic | ); //******************获取源对象数据****************// Dictionary dicObj = new Dictionary(); foreach (var property in propertyInfos) { var value = property?.GetValue(dr); //if (value != null) { (, value); } } var children = GetChildrenTreeNode(notes, idSelector, parentIdSelector, idSelector(dr)); ("children", children); //(dicObj); yield return dicObj; } // return objList; }⽅案⼆先定义类NoteView,返回IEnumerable,再进⾏序列化(1). 定义NoteViewpublic class NodeView{ public int id { get; set; } public int pid { get; set; } public string text { get; set; } public IEnumerable children { get; set; }}(2). 实现///pid为最顶级note的idprivate IEnumerable GetChildrenTreeNode(IEnumerable notes, int pid = 0){ var noteList = (x => { return (); }); //List noteViews = new List(); foreach (var note in noteList) { var view = new NodeView(); = ; = ; = ; en = GetChildrenTreeNode(notes, ); //(view); yield return view; } // return noteViews;}调⽤List notes = new List();(new Node { id = 1, pid = 0, text = "节点1" });(new Node { id = 2, pid = 1, text = "节点1->2" });(new Node { id = 3, pid = 1, text = "节点1->3" });(new Node { id = 4, pid = 2, text = "节点1->2->4" });(new Node { id = 5, pid = 2, text = "节点1->2->5" });(new Node { id = 6, pid = 0, text = "节点6" });(new Node { id = 7, pid = 6, text = "节点6->7" });(new Node { id = 8, pid = 7, text = "节点6->7->8" });//(new Node { id = 9, pid = 1, text = "节点1->9" });//⽅案⼀var treeNotes1 = GetChildrenTreeNode(notes, x => , y => );string jsonStr1 = izeObject(treeNotes1);ine(jsonStr1);//⽅案⼆var treeNotes2 = GetChildrenTreeNode(notes);string jsonStr2 = izeObject(treeNotes2);ine(jsonStr2);3.⽣成第⼆种格式的树型JSON字符串:JSON数据和前⼀种数据的格式不同[ { "Item": { "id": 1, "pid": 0, "text": "节点1" }, "Children": [ { "Item": { "id": 2, "pid": 1, "text": "节点1->2" }, "Children": [ { "Item": { "id": 4, "pid": 2, "text": "节点1->2->4" }, "Children": [] }, { "Item": { "id": 5, "pid": 2, "text": "节点1->2->5" }, "Children": [] } ] }, { "Item": { "id": 3, "pid": 1, "text": "节点1->3" }, "Children": [] } ] }, { "Item": { "id": 6, "pid": 0, "text": "节点6" }, "Children": [ { "Item": { "id": 7, "pid": 6, "text": "节点6->7" }, "Children": [ { "Item": { "id": 8, "pid": 7, "text": "节点6->7->8" }, "Children": [] } ] } ] }](1). TreeItem定义public class TreeItem{ public T Item { get; set; } public IEnumerable> Children { get; set; }}(2). 实现public static IEnumerable> GetChildrenTreeNode(IEnumerable notes, Func idSelector, Func parentIdSelector, K rootId = default(K)){ foreach (var c in (u => { var selector = parentIdSelector(u); return (rootId == null && selector == null) || (rootId != null && (selector)); })) { yield return new TreeItem { Item = c, Children = GetChildrenTreeNode(notes, idSelector, parentIdSelector, idSelector(c)) }; }}调⽤⽰例中notes的数据初始化同上//...//`notes`的数据初始化同上var treeNotes3 = GetChildrenTreeNode2(notes, x => , y => );string jsonStr3 = izeObject(treeNotes3);ine(jsonStr3);

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687382976a5948.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信