哪何根据JSON生成一棵树

时间:2022-11-12 10:32:05
首先是从数据库里取出数据生成了XML:
  <?xml version="1.0" encoding="GB2312" ?> 
- <BOOKLIST>
- <BOOK id="1" name="Spring in Action" type="G" link="1.html">
- <CONTENTLIST>
- <CONTENT id="1" name="开始spring之旅" type="p" link="1.html">
  <SEARCHKEY>spring</SEARCHKEY> 
  </CONTENT>
- <CONTENT id="2" name="Spring是什么" type="p" link="2.html">
  <SEARCHKEY>spring</SEARCHKEY> 
  <SEARCHKEY>什么是spring</SEARCHKEY> 
  </CONTENT>
  <CONTENT id="3" name="理解依赖注入" type="p" link="3.html" /> 
  <CONTENT id="4" name="依赖注入" type="p" link="4.html" /> 
  <CONTENT id="5" name="DI应用" type="p" link="5.html" /> 
  </CONTENTLIST>
- <BMAPLIST>
  <BMAP pid="1" seq="1">1</BMAP> 
  </BMAPLIST>
- <CMAPLIST>
  <CMAP pid="3" seq="1">4</CMAP> 
  <CMAP pid="3" seq="2">5</CMAP> 
  </CMAPLIST>
  </BOOK>
  </BOOKLIST>


我用org.json里的方法
JSONArray json = JSONML.toJSONArray(this.getfilecontent());//this.getfilecontent()是获取之前的XML。
这样生成的JSON如下:
["BOOKLIST",
["BOOK",{"type":"G","link":"1.html","name":"Spring in Action","id":1},
["CONTENTLIST",
["CONTENT",{"type":"p","link":"1.html","name":"开始spring之旅","id":1},
["SEARCHKEY","spring"]],
["CONTENT",{"type":"p","link":"2.html","name":"Spring是什么","id":2},
["SEARCHKEY","spring"],
["SEARCHKEY","什么是spring"]],
["CONTENT",{"type":"p","link":"3.html","name":"理解依赖注入","id":3}],
["CONTENT",{"type":"p","link":"4.html","name":"依赖注入","id":4}],
["CONTENT",{"type":"p","link":"5.html","name":"DI应用","id":5}]],
["BMAPLIST",
["BMAP",{"seq":1,"pid":1},1]],
["CMAPLIST",
["CMAP",{"seq":1,"pid":3},4],
["CMAP",{"seq":2,"pid":3},5]]]]

是否正确,,,
现在的问题是要根据这个JSON文件,用ext生成一棵树该怎么做。。。。。。
树的样子如下:
+booknme
  +content
    +chilecontent


content全部都在<CONTENTLIST>里面,它们之前的父子关系由<cmaplist>里映射出来

现在就是要把JSON里读出来还要处理找出关系再生成一棵树,一点头绪都没有。。。。


本来还有ext.tree.treeloader来loader一个JSON生成树,可是那样JSON要完全符合树的格式,没有找到进行处理后的相关例子。。。

我该怎么办?????????????

9 个解决方案

#1


你生成的JSON的格式没问题
但你要清楚EXT.tree里的一些属性

下面的是我NET的代码

/// <summary>
        /// 判断是否有子节点
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool HasChildNode(string id)
        {
            bool flag = true;
            string sql = "select ID from M_Tree where isShow = 0 and PID = @id";
            SqlParameter[] sqlParameter = {
                                              new SqlParameter("@id",SqlDbType.NVarChar,20)
                                          };
            sqlParameter[0].Value = id;
            int count = Convert.ToInt32(SqlHelper.ExecuteScalar(SqlHelper.Conn, CommandType.Text, sql, sqlParameter));
            if (count > 0)
                flag = false;
            else
                flag = true;
            return flag;
        }

        /// <summary>
        /// 获得menu的列表
        /// </summary>
        /// <returns></returns>
        public List<TreeModel> GetMenuList()
        {
            List<TreeModel> list = new List<TreeModel>();
            string sql = "select * from M_Tree where isShow = 0 and pid = " + HttpContext.Current.Request["node"] + "";
            SqlDataReader reader = SqlHelper.ExecuteReader(SqlHelper.Conn, CommandType.Text, sql);
            while (reader.Read())
            {
                TreeModel model = new TreeModel();
                model.id = reader["id"].ToString();
                model.parentNodeId = Convert.ToString(HttpContext.Current.Request["node"]);
                model.IsRoot = false;
                model.leaf = HasChildNode(model.id);
                model.draggable = true;
                model.text = Convert.ToString(reader["treeCName"]);
                model.TypeID = reader["id"].ToString();
                model.PID = Convert.ToString(HttpContext.Current.Request["node"]);
                model.TypeTitle = Convert.ToString(reader["treeCName"]);
                model.TypeEName = Convert.ToString(reader["treeEName"]);
                list.Add(model);
            }
            reader.Close();
            return list;
        }
//生成JSON
public string TreeStr(string type)
        {
            string str = "";
            if(type=="tree")
                str = JavaScriptConvert.SerializeObject(dal.GetMenuList());
            
            return str;
        }


#2


var url = " Operate.aspx?opt=tree";
var loader = new Ext.tree.TreeLoader({
    url:url,
    requestMethod: 'GET',
    listeners:{
        "loadexception":function(loader,node,response){
            //加载服务器数据,直到成功
            node.loaded = false;
            node.reload.defer(10,node);
         }
    }
});

//根节点
var root = new Ext.tree.AsyncTreeNode({
     id:"0", 
     text:"系统管理",
     leaf:false,
     loader:loader,
     expandable:true,
     expanded:true //展开,默认不展开
}); 

//tree面板
var treePanel = new Ext.tree.TreePanel({
     id:"tree",
     root:root,   //加载根节点 
     singleExpand:true,
     autoHeight:true,
     autoWidth:true,
     frame:false,
     lines:true,//节点之间连接的横竖线         
     animate:true   //以动画形式伸展,收缩子节点
     
});

红色代码的页面就是调用1楼的代码

#3


是说在后台就把数据库里取出来的数据就转换成树格式的JSON,在页面上直接ext.tree.treeloader把JSON文件loader进来就可以了?

#4


我用的是JAVA,有没有JAVA相关的例子

#5


如何用JAVA从数据库里取出的数据构成一个能生成tree的JSON呢?
或从我上面的XML里构造出一个能生成tree的JSON?
我对这个才接触,不是很懂,可任务又在赶,,,

#6


引用 3 楼 zeldazld 的回复:
是说在后台就把数据库里取出来的数据就转换成树格式的JSON,在页面上直接ext.tree.treeloader把JSON文件loader进来就可以了?


对的

#7


http://lib.javaeye.com/blog/162359

你看看这里的吧

网上还有很多这样的文章,你可以自己搜搜

#8


我想像你给的那个网http://lib.javaeye.com/blog/162359的样子去构造个JSON
最后生成的是一个Map 或List,
可是在我的org.json
里的josnArray 没有fromObject(object);方法可以把一个MAP或LIST转成JSON对象啊,那个fromObject是自己写的吗,如何写?

#9


经过几天终于把这个问题解决了,使用了在后台根据查询出来的数据构造一个JSON传到页面去,根据ext.tree.treeloader来加载生成一棵动态树。。。

现在新的一个问题是,生成了JSON后,要在JSON里进行查询,这个怎么查啊。。。。。

#1


你生成的JSON的格式没问题
但你要清楚EXT.tree里的一些属性

下面的是我NET的代码

/// <summary>
        /// 判断是否有子节点
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool HasChildNode(string id)
        {
            bool flag = true;
            string sql = "select ID from M_Tree where isShow = 0 and PID = @id";
            SqlParameter[] sqlParameter = {
                                              new SqlParameter("@id",SqlDbType.NVarChar,20)
                                          };
            sqlParameter[0].Value = id;
            int count = Convert.ToInt32(SqlHelper.ExecuteScalar(SqlHelper.Conn, CommandType.Text, sql, sqlParameter));
            if (count > 0)
                flag = false;
            else
                flag = true;
            return flag;
        }

        /// <summary>
        /// 获得menu的列表
        /// </summary>
        /// <returns></returns>
        public List<TreeModel> GetMenuList()
        {
            List<TreeModel> list = new List<TreeModel>();
            string sql = "select * from M_Tree where isShow = 0 and pid = " + HttpContext.Current.Request["node"] + "";
            SqlDataReader reader = SqlHelper.ExecuteReader(SqlHelper.Conn, CommandType.Text, sql);
            while (reader.Read())
            {
                TreeModel model = new TreeModel();
                model.id = reader["id"].ToString();
                model.parentNodeId = Convert.ToString(HttpContext.Current.Request["node"]);
                model.IsRoot = false;
                model.leaf = HasChildNode(model.id);
                model.draggable = true;
                model.text = Convert.ToString(reader["treeCName"]);
                model.TypeID = reader["id"].ToString();
                model.PID = Convert.ToString(HttpContext.Current.Request["node"]);
                model.TypeTitle = Convert.ToString(reader["treeCName"]);
                model.TypeEName = Convert.ToString(reader["treeEName"]);
                list.Add(model);
            }
            reader.Close();
            return list;
        }
//生成JSON
public string TreeStr(string type)
        {
            string str = "";
            if(type=="tree")
                str = JavaScriptConvert.SerializeObject(dal.GetMenuList());
            
            return str;
        }


#2


var url = " Operate.aspx?opt=tree";
var loader = new Ext.tree.TreeLoader({
    url:url,
    requestMethod: 'GET',
    listeners:{
        "loadexception":function(loader,node,response){
            //加载服务器数据,直到成功
            node.loaded = false;
            node.reload.defer(10,node);
         }
    }
});

//根节点
var root = new Ext.tree.AsyncTreeNode({
     id:"0", 
     text:"系统管理",
     leaf:false,
     loader:loader,
     expandable:true,
     expanded:true //展开,默认不展开
}); 

//tree面板
var treePanel = new Ext.tree.TreePanel({
     id:"tree",
     root:root,   //加载根节点 
     singleExpand:true,
     autoHeight:true,
     autoWidth:true,
     frame:false,
     lines:true,//节点之间连接的横竖线         
     animate:true   //以动画形式伸展,收缩子节点
     
});

红色代码的页面就是调用1楼的代码

#3


是说在后台就把数据库里取出来的数据就转换成树格式的JSON,在页面上直接ext.tree.treeloader把JSON文件loader进来就可以了?

#4


我用的是JAVA,有没有JAVA相关的例子

#5


如何用JAVA从数据库里取出的数据构成一个能生成tree的JSON呢?
或从我上面的XML里构造出一个能生成tree的JSON?
我对这个才接触,不是很懂,可任务又在赶,,,

#6


引用 3 楼 zeldazld 的回复:
是说在后台就把数据库里取出来的数据就转换成树格式的JSON,在页面上直接ext.tree.treeloader把JSON文件loader进来就可以了?


对的

#7


http://lib.javaeye.com/blog/162359

你看看这里的吧

网上还有很多这样的文章,你可以自己搜搜

#8


我想像你给的那个网http://lib.javaeye.com/blog/162359的样子去构造个JSON
最后生成的是一个Map 或List,
可是在我的org.json
里的josnArray 没有fromObject(object);方法可以把一个MAP或LIST转成JSON对象啊,那个fromObject是自己写的吗,如何写?

#9


经过几天终于把这个问题解决了,使用了在后台根据查询出来的数据构造一个JSON传到页面去,根据ext.tree.treeloader来加载生成一棵动态树。。。

现在新的一个问题是,生成了JSON后,要在JSON里进行查询,这个怎么查啊。。。。。