首页 新闻 会员 周边

easyui combotree 数据源JSON生成问题

0
悬赏园豆:15 [已解决问题] 解决于 2015-12-18 11:26

使用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函数应该怎么写?求大神支招!

问题补充:

是问题没有描述清楚还是什么情况啊!没有人看哦!

有机物的主页 有机物 | 初学一级 | 园豆:19
提问于:2015-12-16 16:59
< >
分享
最佳答案
0
[{
    "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. 這個結果是是範例,實際上有多少層有多少節點,請自行調整。

收获园豆:15
RosonJ | 老鸟四级 |园豆:4910 | 2015-12-17 09:12

这个结构是对的,就是不知道用ASP.NET怎么用算法去实现这样的JSON。

有机物 | 园豆:19 (初学一级) | 2015-12-17 09:14

我知道这个JSON怎么写,但是,按照上面的表结构,用ASP.NET动态生成的话,这个递归的算法就不知道怎么去写了,因为这个地方始终都是通过value截取递归的,没有通过ID关联,所以感觉这个算法做起来比较困难。

有机物 | 园豆:19 (初学一级) | 2015-12-17 09:17

@有机物:

請說明實現的困難點,

原始的資料來源有困難,還是object的產生有困難,還是object轉JSON有困難,

只說不知道怎麼產生結果,我想沒有人幫助的了你。

RosonJ | 园豆:4910 (老鸟四级) | 2015-12-17 09:18

@RosonJ: 就是我用SQL语句得到上面的表结构,通过获取的结果集生成树JSON这个过程的算法不知道怎么实现。

有机物 | 园豆:19 (初学一级) | 2015-12-17 09:20

@有机物: 

明白了,

先請問當子節點超過9個,value的規則為何,

A01

A02

.

.

.

A09

A??

如上的情況,value為何?

RosonJ | 园豆:4910 (老鸟四级) | 2015-12-17 09:23

@RosonJ: 

你能把邮箱发给我吗?我把结构发到你邮箱。

有机物 | 园豆:19 (初学一级) | 2015-12-17 09:26

@有机物: 

peterjan1989@gmail.com

google的行嗎?

RosonJ | 园豆:4910 (老鸟四级) | 2015-12-17 09:27

@RosonJ: 我先试试看,能不能发送邮件到你邮箱。我的是hotmail。

有机物 | 园豆:19 (初学一级) | 2015-12-17 09:28

@RosonJ: 我用的我邮箱给你发了一封邮件,你查看一下,应该是可以收取的,我稍后把资料整理一下,发到你的邮箱。

有机物 | 园豆:19 (初学一级) | 2015-12-17 09:33

@有机物: 

收到並回覆了。

RosonJ | 园豆:4910 (老鸟四级) | 2015-12-17 09:33

@有机物: 

完整的做法發給你了,有不懂的再問吧。

RosonJ | 园豆:4910 (老鸟四级) | 2015-12-17 11:51

@RosonJ: 好的,我看看先,谢谢了。

有机物 | 园豆:19 (初学一级) | 2015-12-17 11:52

@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();

 

因为我的邮件发送到你那边有点问题,有时无法发送过去,所以,我这边就直接在博客园中给你做了回复。

我抽个时间看看你的代码,然后再改一下。

谢谢。

有机物 | 园豆:19 (初学一级) | 2015-12-18 11:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册