使用ASP.NET 给easyui combotree生成数据源JSON时出现问题。
现有表结构
name value
分类A A
分类A节点1 A01
分类A节点2 A011
分类A节点3 A012
分类A节点4 A013
分类A节点5 A02
分类A节点6 A021
分类A节点7 A022
分类A节点8 A0112
分类B节点 B
分类B节点 B01
上面的数据类似循环, value的长度已知,表结构中的数据最大长度为5,value中根据A、B来对数节点分类,例如,value值为:A011,A012,A013所在的父节点为:A01.
A01,A02所在的父节点为:A。其中,A,B为顶级节点。
那么,生成的JSON函数应该怎么写?求大神支招!
[{ "id": "A", "text": "分类A", "children": [{ "id": "A01", "text": "分类A节点1", "children": [{ "id": "A011", "text": "分类A节点2", "children": [{ "id": "A0112", "text": "分类A节点8" }] }, { "id": "A012", "text": "分类A节点3" }, { "id": "A013", "text": "分类A节点4" }] }, { "id": "A02", "text": "分类A节点5", "children": [{ "id": "A021", "text": "分类A节点6" }, { "id": "A022", "text": "分类A节点7" }] }] }, { "id": "B", "text": "分类B", "children": [{ "id": "B01", "text": "分类B节点1" }] }]
先給結果,你用ASP.NET寫出這個結構的object,再轉JSON
如果寫object有問題可以再問,轉JSON有問題也可以再問。
P.S. 這個結果是是範例,實際上有多少層有多少節點,請自行調整。
这个结构是对的,就是不知道用ASP.NET怎么用算法去实现这样的JSON。
我知道这个JSON怎么写,但是,按照上面的表结构,用ASP.NET动态生成的话,这个递归的算法就不知道怎么去写了,因为这个地方始终都是通过value截取递归的,没有通过ID关联,所以感觉这个算法做起来比较困难。
@有机物:
請說明實現的困難點,
原始的資料來源有困難,還是object的產生有困難,還是object轉JSON有困難,
只說不知道怎麼產生結果,我想沒有人幫助的了你。
@RosonJ: 就是我用SQL语句得到上面的表结构,通过获取的结果集生成树JSON这个过程的算法不知道怎么实现。
@有机物:
明白了,
先請問當子節點超過9個,value的規則為何,
A01
A02
.
.
.
A09
A??
如上的情況,value為何?
@RosonJ:
你能把邮箱发给我吗?我把结构发到你邮箱。
@有机物:
peterjan1989@gmail.com
google的行嗎?
@RosonJ: 我先试试看,能不能发送邮件到你邮箱。我的是hotmail。
@RosonJ: 我用的我邮箱给你发了一封邮件,你查看一下,应该是可以收取的,我稍后把资料整理一下,发到你的邮箱。
@有机物:
收到並回覆了。
@有机物:
完整的做法發給你了,有不懂的再問吧。
@RosonJ: 好的,我看看先,谢谢了。
@RosonJ:
有两种方式:
第一种,通过SQL语句,生成一个新的列,这个列用于关联Value
string sql = @"SELECT * FROM (
SELECT ID id,Name text,Value ,
(case LEN(Value)
when '1' then '0'
when '3' then SUBSTRING(Value,0,len(Value)-1)
else SUBSTRING(Value,0,len(Value)) end) PVALUE from
(
SELECT G.IsHierarchical,G.MaxValueLength,O.Name,O.Value,O.ID FROM [dbo].[tblIndicatorGroup] G,[dbo].[tblIndicatorGroupOption] O WHERE G.ID=O.GroupID and G.id='17'
)NEWTABLE)NEWTABLE";
public List<object> CreateJson(DataTable dt, string pid)
{
List<object> list = new List<object>();
DataRow[] drs = dt.Select("PValue='" + pid + "'");
foreach (DataRow dr in drs)
{
var d = new { id = dr["id"], text = dr["text"], children = CreateJson(dt, dr["Value"].ToString()) };
list.Add(d);
}
return list;
}
第二种方式:
SqlDataReader reader = cmd.ExecuteReader();
int nLastLevel = -1;
int nMaxLevel = 5; // 根据需要修改
int nCurrLevel = 0;
JArray[] children = new JArray[nMaxLevel];
children[0] = new JArray();
while (reader.Read())
{
string strValue = (string)reader["Value"];
nCurrLevel = strValue.Length - 1; // 根据需要修改
if (nCurrLevel >= 2)
nCurrLevel--;
JObject option = new JObject();
option.Add("value", strValue);
option.Add("text", (string)reader["Name"]);
if (nCurrLevel >= nLastLevel)
{
children[nCurrLevel].Add(option);
if (nCurrLevel < nMaxLevel - 1)
children[nCurrLevel + 1] = new JArray();
}
else
{ // nCurrLevel < nLastLevel
while (nCurrLevel < nLastLevel)
{
if (children[nLastLevel].Count > 0)
{
int m = children[nLastLevel - 1].Count - 1;
JObject parent = (JObject)children[nLastLevel - 1][m];
parent.Add("children", children[nLastLevel]);
}
else
break;
nLastLevel--;
}
children[nCurrLevel].Add(option);
if (nCurrLevel < nMaxLevel - 1)
children[nCurrLevel + 1] = new JArray();
}
nLastLevel = nCurrLevel;
}
while (0 < nLastLevel)
{
if (children[nLastLevel].Count > 0)
{
int m = children[nLastLevel - 1].Count - 1;
JObject parent = (JObject)children[nLastLevel - 1][m];
parent.Add("children", children[nLastLevel]);
}
else
break;
nLastLevel--;
}
reader.Close();
this.TextBox1.Text = children[0].ToString();
conn.Close();
因为我的邮件发送到你那边有点问题,有时无法发送过去,所以,我这边就直接在博客园中给你做了回复。
我抽个时间看看你的代码,然后再改一下。
谢谢。