将微信获取的部门JSON字符串转换成EASY UI Tree能够绑定的JSON(JSONPath的使用)
需求:将红框中的JSON字符串转换成红框下面的JSON字符串,以供easy ui tree控件使用
思路:
1、创建一个实体,组织架构实体类,包括两个属性及一个List
2、遍历每个JSON数组,如果是顶级节点,则直接插入
3、如果不是顶级,则查找低级,将自己添加至list中
OrganizationNode.cs 具体代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OAuth2 { public class OrganizationNode { public OrganizationNode() { children = new List<OrganizationNode>(); } public string id { get; set; } public string name { get; set; } public List<OrganizationNode> children { get; set; } } }
遍历方法:
/// <summary> /// 获取微信用户 /// </summary> /// <returns></returns> public static string GetWxDepts() { var token = GetAccessToken(); var result = ""; string corpId = WxCorpId; StringBuilder sbJson = new StringBuilder(); Dictionary<string, object> dict = HttpGet(string.Format("https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token={0}&id={1}", token, corpId)); object deptList; if (dict.TryGetValue("department", out deptList)) { JArray deptArray = (JArray)deptList; JObject nodeToken = null; foreach(JToken dep in deptArray) { string parentid = dep["parentid"].ToString(); //TODO:枚举数组,构建OrganizationNode总包对象(Json.Net) //TODO:加载行级数据生成新的OrganizationNode对象 OrganizationNode newNode = dep.ToObject<OrganizationNode>(); if (parentid == "0") nodeToken = JObject.FromObject(newNode); else { if (nodeToken == null) throw new Exception("主节点未初始化,检查接口API信息"); //TODO:依据parentid,将新Node对象插入至对于的节点位置 JToken targetNode = null; if (parentid == "1") targetNode = nodeToken; else targetNode = nodeToken.SelectToken(string.Format("$..children[?(@.id=='{0}')]", parentid), false); if (targetNode == null) throw new Exception(string.Format("对应id {0} 节点未找到", parentid)); //JToken lastChild = targetNode.LastOrDefault(); JArray children = (JArray)targetNode.SelectToken(".children"); children.Add(JToken.FromObject(newNode)); //targetNode.Parent = org; //targetNode.Last.AddAfterSelf(newNode); } } //result = OAuth2.JsonHelper.JsonSerialize(deptList); result = "[" + nodeToken.ToString(Newtonsoft.Json.Formatting.None) + "]"; } return result; }