package cn.info.platform.test;
import java.io.IOException;
import java.lang.String;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests;
import cn.info.platform.dao.FaqDao;
import cn.info.platform.entity.Faq;
import cn.info.platform.entity.FaqType;
/**
* @author Rocky
*/
@ContextConfiguration("classpath:spring-*.xml")
public class FaqTest extends AbstractJUnit38SpringContextTests {
@Autowired
private FaqDao faqDao;
public void testGetByID() {
ArrayList<FaqType> faqTypeList = faqDao.faqTypeList();
String nodeTree = getNodeTree(faqTypeList, 0);
System.out.println(nodeTree);
String nodeTreeSql = getNodeTreeSql(0);
System.out.println(nodeTreeSql);
}
private String getNodeTreeSql(int fid){
StringBuffer nodeStr = new StringBuffer("{");
nodeStr = nodeTreeSql(nodeStr, 0);
nodeStr = nodeStr.deleteCharAt(nodeStr.length() - 1);
return nodeStr.toString();
}
private StringBuffer nodeTreeSql(StringBuffer nodeTreeStr, int fid){
ArrayList<FaqType> faqTypeList = faqDao.faqTypeByFid(fid);
int len = faqTypeList.size();
if(len > 0){
nodeTreeStr.append("\"children\":[");
for(int i = 0; i < len; i++){
nodeTreeStr.append("{\"name\":\"" + faqTypeList.get(i).getName() + "\",");
nodeTreeStr = nodeTreeSql(nodeTreeStr, faqTypeList.get(i).getId());
}
nodeTreeStr.deleteCharAt(nodeTreeStr.length() - 1);
nodeTreeStr.append("]},");
}else{
nodeTreeStr.deleteCharAt(nodeTreeStr.length() - 1);
nodeTreeStr.append("},");
}
return nodeTreeStr;
}
private String getNodeTree(ArrayList<FaqType> faqTypeList, int fid){
StringBuffer nodeStr = new StringBuffer("{");
nodeStr = nodeTree(nodeStr, 0, faqTypeList);
nodeStr = nodeStr.deleteCharAt(nodeStr.length() - 1);
return nodeStr.toString();
}
private StringBuffer nodeTree(StringBuffer nodeTreeStr, int fid, ArrayList<FaqType> faqTypeList){
Boolean hasChildren = false;
StringBuffer nodeTr = new StringBuffer();
for(int i = 0; i < faqTypeList.size(); i++){
if(faqTypeList.get(i).getFid() == fid){
nodeTr.append("{\"name\":\"" + faqTypeList.get(i).getName() + "\",");
nodeTr = nodeTree(nodeTr, faqTypeList.get(i).getId(), faqTypeList);
hasChildren = true;
}
}
if(hasChildren == false){
nodeTreeStr.deleteCharAt(nodeTreeStr.length() - 1);
nodeTreeStr.append("},");
}else{
nodeTr.deleteCharAt(nodeTr.length() - 1);
nodeTreeStr.append("\"children\":[").append(nodeTr).append("]},");
}
return nodeTreeStr;
}
}
Json2Tree
package cn.info.platform.test;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import cn.info.platform.entity.FaqType;
/**
* Json字符串工具类
*
* @author luojiang2
*
*/
public class Json2Tree {
/**
* 根据id,pid和树要显示的属性生成树的Json字符串
*
* @param <T>
* @param objs
* @param pidAttr
* @param idAttr
* @return
* @throws Exception
*/
public static <T> String treeJson(long pid , List<T> objs, StringBuilder builder, String pidAttr, String idAttr, String labelAttr) throws Exception {
if (objs.size() == 0){
return "{\"children\":[]}";
}
for(Iterator<T> iter = objs.iterator(); iter.hasNext();) {
T t = iter.next();
long id = getLong(t, idAttr);
long temp_pid = getLong(t, pidAttr);
String label = getValue(t, labelAttr);
if(pid == Long.MAX_VALUE){
break;
}
if(temp_pid == pid){
builder.append("{\"id\":\"").append(id).append("\",");
builder.append("\"name\":\"").append(label).append("\",");
if(isHasChildren(id, objs, pidAttr)) {
builder.append("\"children\":[");
treeJson(id, objs, builder, pidAttr, idAttr, labelAttr);
builder.append("]},");
}else{
builder.deleteCharAt(builder.length() - 1).append("},");
}
}
}
builder.deleteCharAt(builder.length() - 1);
return builder.toString();
}
/**
* 判断给定id节点是否有孩子节点
* @param <T>
* @param id
* @param objs
* @return
* @throws Exception
*/
private static <T> boolean isHasChildren(long id , List<T> objs, String pidAttr) throws Exception{
for(T t : objs){
long pid = getLong(t, pidAttr);
if(pid == id){
return true;
}
}
return false;
}
private static <T> long getLong(T t, String attrName) throws Exception {
Field field = t.getClass().getDeclaredField(attrName);
if (!field.isAccessible()) {
field.setAccessible(true);
}
Object value = field.get(t);
if (value == null){
return Long.MAX_VALUE;
}else{
return Long.parseLong(value.toString());
}
}
private static <T> String getValue(T t, String attrName) throws Exception {
Field field = t.getClass().getDeclaredField(attrName);
if (!field.isAccessible()) {
field.setAccessible(true);
}
Object value = field.get(t);
if (value == null){
return "\"\"";
}else{
return value.toString();
}
}
public static void main(String[] args) throws Exception {
List<FaqType> lists = new ArrayList<FaqType>();
FaqType a1 = new FaqType();
FaqType a2 = new FaqType();
FaqType a3 = new FaqType();
FaqType a4 = new FaqType();
FaqType a5 = new FaqType();
FaqType a6 = new FaqType();
a1.setFid(-1);
a1.setId(1);
a1.setName("a");
a2.setFid(1);
a2.setId(2);
a2.setName("b");
a3.setFid(1);
a3.setId(3);
a3.setName("c");
a4.setFid(2);
a4.setId(4);
a4.setName("d");
a5.setFid(3);
a5.setId(5);
a5.setName("e");
a6.setFid(5);
a6.setId(6);
a6.setName("f");
lists.add(a1);
lists.add(a2);
lists.add(a3);
lists.add(a4);
lists.add(a5);
lists.add(a6);
String results = treeJson( -1,lists, new StringBuilder(), "fid", "id", "name");
System.out.println(results);
}
}
分享到:
相关推荐
Java递归算法构造JSON树形结构,Java递归算法构造JSON树形结构Java递归算法构造JSON树形结构
树型表结构,查询一次就可以构建出一个JSON的数据结构树,适用于EXT树
自己总结的。java遍历JSON树
java读取json格式3层树结构数据,目前代码是能读到树的3层,可以继续在代码里面添加读取层数。
此方法可快速循环遍历多级嵌套或树状json结构,根据传入的参数获得对应的父子节点的属性值。
题有点叼,主要是java方面的试题,题不多,但从基本语言到高级应用都有涉及
下面小编就为大家带来一篇java根据数据库表内容生产树结构json数据的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
前台: function listToTree(myId,pId,list){ function exists(list, parentId){ for(var i=0; i<list.length; i++){ if (list[i][myId] == parentId) return true; } return false;
具体实现逻辑-->https://blog.csdn.net/m0_59252007/article/details/119007807 参考下这个CSDN文字说明,操作下,这里面主要有 1、代码; 2、数据库脚本; 3、JSON结果字符串字段;
一、数据库父子结构数据设计 大部分采用 parentId的形式来存储父id,并且只存储父id,祖父Id不存储。也可以添加存储层级级别或者层级关系等字段。 CREATE TABLE `t_resource` ( `id` varchar(255) NOT NULL ...
是可运行的jar包,运行方法:java -jar HiJson_whuang-0.0.1-SNAPSHOT.jar 功能:格式化json字符,并且以树状结构来展示目录级别,包括其他好用的功能,比如复制图片到剪切板,双引号转义等
用Java 语言构造带children属性的json报文,带详细测试数据
主要介绍了JAVA后台转换成树结构数据返回给前端的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
格式如下,适合做省市区联动&树形菜等: [{ "value": "110000", "label": "北京市", "children": [{ "value": "110100", "label": "北京市", "children": [{ "value": "110101", "label": "东城区" ...
树形结构数据库设计,和java获取json到前台显示。
海鸟一种树状结构查询语言 这是我在工作时编写的树查询语言的重写。 我在工作中编写的那个不是开源的,并且需要一些自定义的C ++实现。 这个版本是对我在Java语言中使用的树查询语言的重写。 应用 该库具有用于进行...
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力,下面是一小示例,需要的朋友可以参考下
jpath 是 JSON 和树状数据结构的节点选择器。 您可以将 jpath 用于 JSON、YAML 以及内置的 Map 和 List 类。 (jpath 适用于 XML,但用处不大。) 不要再次解析数据。 jpath 使用已经解析的对象。 对于 JSON 或 ...
使用jdbc查询结果,使用递归生成前端所需要的树形json数据,用SpringMVC传送数据到前端,前端接收,引入相关js文件,在画面上接收后端传输的数据,使用js动态渲染到画面中。有疑问随时私信我即可。
有预览图,要html效果,有jsp代码,使用者只需要在后台构建一个json对象,返回json数据,这里我都给你写好了,只需要直接使用。我这里从后台返回的数据存放在json.txt里。...后台通过递归来获取树状结构的方法。