/// <summary>
/// 组织rspList
/// </summary>
/// <param name="rspList">返回前端的json结构</param>
/// <param name="jsonText">json文本</param>
public static void GetrspList(List<rspListDto> rspList, string jsonText)
{
Recursion(jsonText, rspList);
}
/// <summary>
/// 递归算法
/// </summary>
/// <param name="json">json字符串</param>
/// <param name="strList">返回前端的json结构</param>
/// <param name="pname">拼接节点path</param>
/// <param name="pid">父级id</param>
/// <returns></returns>
private static List<rspListDto> Recursion(string json, List<rspListDto> strList, string pname = "", string pid = "")
{
var jobj = new JObject();
if (json.StartsWith("[") && json.EndsWith("]"))
{
var arrs = JArray.Parse(json);
jobj = (JObject)arrs[0];
}
else
{
jobj = JObject.Parse(json);
}
foreach (var x in jobj)
{
string id = SnowflakeId.NewId;
string curPname = pname;
if (x.Value.Type == JTokenType.Array ||
x.Value.Type == JTokenType.Object)
{
var jsonStr = x.Value.ToString();
bool flag = IsJobject(jsonStr);
string nodetype = GetJsonNodeType(x.Value);
if (flag)
{
Recursion(jsonStr, strList, string.Format("{0}.{1}", curPname, x.Key).TrimStart('.'), id);
}
rspListDto keyValue = new rspListDto
{
id = id,
pid = pid,
node_dis = x.Key,
node_name = "",
fullNode = string.Format("{0}.{1}", curPname, x.Key).TrimStart('.'),
node_type = nodetype
};
strList.Add(keyValue);
}
else
{
rspListDto keyValue = new rspListDto
{
id = id,
pid = pid,
node_dis = x.Key,
node_name = x.Value.ToString(),
fullNode = string.Format("{0}.{1}", pname, x.Key),
node_type = "attr"
};
strList.Add(keyValue);
}
}
return strList;
}
private static string GetJsonNodeType(JToken valueStr)
{
if (valueStr == null)
{
return string.Empty;
}
string formatStr = valueStr.ToString(Newtonsoft.Json.Formatting.None).TrimStart();
string nodeType;
if (formatStr.StartsWith("{"))
{
nodeType = "obj";
}
else if (formatStr.StartsWith("\"") || formatStr.StartsWith("'"))
{
nodeType = "attr";
}
else if (formatStr.StartsWith("[{"))
{
nodeType = "objList";
}
else
{
nodeType = "attrList";
}
return nodeType;
}
/// <summary>
/// 判断是不是jobject对象
/// </summary>
/// <param name="jsonstr">json字符串</param>
/// <returns></returns>
private static bool IsJobject(string jsonstr)
{
bool flag = true;
if (string.IsNullOrWhiteSpace(jsonstr))
{
flag = false;
return flag;
}
try
{
JObject.Parse(jsonstr);
}
catch (Exception)
{
flag = false;
}
return flag;
}
测试数据
//string jsonText = “{ ‘Rows’:{ ‘id’:{‘name’:‘zxy’,‘age’:‘18’},‘wo’:[‘123’],‘qlr’:[{‘xm’:‘xm’}]}}”;
string jsonText = “[{ ‘Rows’:{ ‘id’:{‘name’:‘zxy’,‘age’:‘18’},‘wo’:[‘123’],‘qlr’:[{‘xm’:‘xm’}]}}]”;
public class rspListDto
{
/// <summary>
/// 后端每次解析json时生成,用于前端展示树形用
/// </summary>
public string id { get; set; }
/// <summary>
/// 父级编号(后端每次解析json时生成,用于前端展示树形用)
/// </summary>
public string pid { get; set; }
/// <summary>
/// 节点名称
/// </summary>
public string node_name { get; set; }
/// <summary>
/// 节点描述
/// </summary>
public string node_dis { get; set; }
/// <summary>
/// 节点类型
/// </summary>
public string node_type { get; set; }
/// <summary>
/// 完整节点名称(包括父级)
/// </summary>
public string fullNode { get; set; }
}