一、功能实现

1、节点树查询:
按ID查询树
2、节点新增:
http://host/tree_data/node/${treeId}
in: {node: {key: ..., ...}, parent: ${key}, sequ: ${sequ}}
3、节点修改
http://host/tree_data/node/${treeId}/${key}
in: {node: {key: ..., ...}}
4、节点删除
http://host/tree_data/node/${treeId}/${key}

二、数据表结构

CREATE TABLE `catagory_tree`  (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '分类树名称:PRODUCT:产品分类 GOODS:商品分类',
`json_tree` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '直接存储ANTD树表的数据结构',
`modify_staff` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`modify_time` datetime(0) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `AK_uni_catagory_tree_name`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

三、json字符串

[{
"id": 1,
"code": "FLOW_NODE_1",
"name": "环节A",
"children": [{
"id": 2,
"code": "RULE_NODE_1",
"name": "规则A"
}, {
"id": 3,
"code": "RULE_NODE_2",
"name": "规则B"
}, {
"id": 4,
"code": "PARALLEL_NODE_2",
"name": "并行节点",
"children": [{
"id": 5,
"code": "RULE_NODE_3",
"name": "规则C1"
}, {
"id": 6,
"code": "RULE_COLLECTION_1",
"name": "规则集1",
"children": [{
"id": 7,
"code": "RULE_NODE_4",
"name": "规则C21"
}, {
"id": 8,
"code": "RULE_NODE_5",
"name": "规则C22"
}]
}]
}, {
"id": 9,
"code": "MUTUAL_NODE_1",
"name": "互斥节点",
"children": [{
"id": 10,
"code": "RULE_NODE_6",
"name": "规则D1"
}, {
"id": 11,
"code": "RULE_NODE_7",
"name": "规则D2"
}]
}]
}, {
"id": 12,
"code": "FLOW_NODE_2",
"name": "环节B" }]

四、pom文件依赖

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>

五、controller层

package cn.chinaunicom.srigz.goods.admin.controller;

import cn.chinaunicom.srigz.goods.admin.service.CatagoryTreeService;
import cn.chinaunicom.srigz.goods.admin.utils.ActionHelper;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.Map; @RestController
public class CatagoryTreeController {
@Autowired
private CatagoryTreeService catagoryTreeService; @ApiOperation(value="查询分类树信息", notes="输入分类树Id")
@RequestMapping(value = "/api/v1/tree_data/node/{treeId}", method = RequestMethod.GET)
public Map getOne(@ApiParam(required = true, value = "分类树ID") @PathVariable Integer treeId){
return ActionHelper.responseOk(catagoryTreeService.getOne(treeId));
} @ApiOperation(value="新建节点", notes="根据输入参数创建节点")
@RequestMapping(value = "/tree_data/node/{treeId}", method = RequestMethod.POST)
public Map addOne(@ApiParam(required = true, value = "分类树ID")@PathVariable Integer treeId,
@ApiParam(required = true, value = "节点信息、父类ID、数组位置") @RequestBody Map map){
return ActionHelper.responseOk(catagoryTreeService.addOne(treeId,map));
} @ApiOperation(value="更新节点信息", notes="更新节点信息")
@RequestMapping(value = "/tree_data/node/{treeId}/{id}", method = RequestMethod.PATCH)
public Map updateOne(@ApiParam(required = true, value = "分类树ID")@PathVariable Integer treeId,
@ApiParam(required = true, value = "节点ID")@PathVariable Integer id,
@ApiParam(required = true, value = "节点信息") @RequestBody Map map){
return ActionHelper.responseOk(catagoryTreeService.updateOne(treeId,id,map));
} @ApiOperation(value="删除节点详情", notes="删除节点详情")
@RequestMapping(method = RequestMethod.DELETE,value = "/tree_data/node/{treeId}/{id}")
public Map remove(@ApiParam(required = true, value = "分类树ID")@PathVariable Integer treeId,
@ApiParam(required = true, value = "节点ID")@PathVariable Integer id){
return ActionHelper.responseOk(catagoryTreeService.remove(treeId,id));
}
}

六、service层

JSONArray jsonArray = JSON.parseArray(jsonTree); //由json字符串变成json数组对象

jsonArray.toJSONString() //由json数组对象变成json字符串

package cn.chinaunicom.srigz.goods.admin.service;

import cn.chinaunicom.srigz.goods.admin.database.dao.CatagoryTreeRepository;
import cn.chinaunicom.srigz.goods.admin.database.model.CatagoryTree;
import cn.chinaunicom.srigz.goods.admin.utils.Recursive;
import cn.chinaunicom.srigz.goods.common.exception.AlreadyExistException;
import cn.chinaunicom.srigz.goods.common.exception.BadRequestException;
import cn.chinaunicom.srigz.goods.common.exception.NotFoundException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import java.util.*; @Service
public class CatagoryTreeService {
@Autowired
private CatagoryTreeRepository catagoryTreeRepository; /**
* 查询单个分类树
* @param treeId
* @return
*/
public JSON getOne(Integer treeId) {
CatagoryTree catagoryTree = catagoryTreeRepository.findById(treeId.longValue()).get();
return JSON.parseArray(catagoryTree.getJsonTree());
} /**
* 增加单个节点
* @param treeId
* @param map
* @return
*/
@Transactional
public JSON addOne(Integer treeId, Map map) {
CatagoryTree catagoryTree = catagoryTreeRepository.findById(treeId.longValue()).get();
String jsonTree = catagoryTree.getJsonTree();
JSONArray jsonArray = JSON.parseArray(jsonTree);
Object parentId = map.get("parentId");
Integer sequ = (Integer) map.get("sequ");
if(sequ <= 0 ){
throw new BadRequestException("数组位置不正确");
}
Map nodeMap = (Map) map.get("node");
JSONObject node = new JSONObject(nodeMap);
List list = new ArrayList();
List keyList = Recursive.recursive(jsonArray,"id",list);
for (Object key : keyList) {
if (nodeMap.get("id").toString().equals(key.toString())) {
throw new AlreadyExistException("节点ID为" + key);
}
}
Recursive.addRecursive(jsonArray,node,sequ,"id",parentId);
catagoryTree.setJsonTree(jsonArray.toJSONString());
catagoryTreeRepository.save(catagoryTree);
return jsonArray;
} /**
* 修改单个节点
* @param treeId
* @param id
* @param map
* @return
*/
@Transactional
public JSON updateOne(Integer treeId, Integer id, Map map) {
CatagoryTree catagoryTree = catagoryTreeRepository.findById(treeId.longValue()).get();
String jsonTree = catagoryTree.getJsonTree();
JSONArray jsonArray = JSON.parseArray(jsonTree);
List list = new ArrayList();
List keyList = Recursive.recursive(jsonArray,"id",list);
JSONObject node = new JSONObject(map);
if (id.toString().equals(map.get("id").toString())) {
for (Object key : keyList) {
if (id.toString().equals(key.toString())) {
Recursive.updateRecursive(jsonArray,"id",id,node);
catagoryTree.setJsonTree(jsonArray.toJSONString());
catagoryTree.setModifyTime(new Date());
catagoryTreeRepository.save(catagoryTree);
return jsonArray;
}
}
}else {
throw new BadRequestException("id is not allowed to be modified");
}
throw new NotFoundException("节点ID为" + id);
} /**
* 删除节点以及子节点
* @param treeId
* @param id
* @return
*/
@Transactional
public JSON remove(Integer treeId, Integer id) {
CatagoryTree catagoryTree = catagoryTreeRepository.findById(treeId.longValue()).get();
String jsonTree = catagoryTree.getJsonTree();
JSONArray jsonArray = JSON.parseArray(jsonTree);
List list = new ArrayList();
List keyList = Recursive.recursive(jsonArray,"id",list);
for (Object key : keyList) {
if (id.toString().equals(key.toString())) {
Recursive.removeRecursive(jsonArray,"id",id);
catagoryTree.setJsonTree(jsonArray.toJSONString());
catagoryTreeRepository.save(catagoryTree);
return jsonArray;
}
}
throw new NotFoundException("节点ID为" + id);
} }

七、把增删查改的递归方法写成工具类

package cn.chinaunicom.srigz.goods.admin.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import java.util.List; public class Recursive { /**
* 递归取出所有Key对应的value值
* @param jsonArray 需要查询的目标主体
* @param key 需要查询的字段名key
* @param list 存储value值
* @return
*/
public static List recursive(JSONArray jsonArray, String key, List list) {
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
JSONArray children = jsonObject.getJSONArray("children");
if (children != null) {
list.add(jsonObject.get(key));
recursive(children,key,list);
}else {
list.add(jsonObject.get(key));
}
}
return list;
} /**
* 增加节点
* @param jsonArray 需要更新的目标主体
* @param node 增加节点信息
* @param sequ 数组的位置
* @param key 目标主体中的字段名key
* @param value 节点信息与key对应的value
*/
public static void addRecursive(JSONArray jsonArray, JSONObject node, Integer sequ, String key, Object value) {
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
JSONArray children = jsonObject.getJSONArray("children");
if (children != null) {
if (value.toString().equals(jsonObject.get(key).toString())) {
if(sequ > children.size()){
children.add(children.size(), node);
}else{
children.add(sequ-1, node);
}
return;
}
addRecursive(children,node,sequ,key,value);
} else {
if (value.toString().equals(jsonObject.get(key).toString())) {
JSONArray array = new JSONArray();
array.add(node);
jsonObject.put("children", array);
return;
}
}
}
} /**
* 根据条件更新节点
* @param jsonArray 需要更新的目标主体
* @param key 目标主体中的字段名key
* @param value 更新节点信息与key对应的value
* @param node 更新节点信息
*/
public static void updateRecursive(JSONArray jsonArray, String key, Object value, JSONObject node) {
for (int i = 0; i < jsonArray.size() ; i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
JSONArray children = jsonObject.getJSONArray("children");
if (value.toString().equals(jsonObject.get(key).toString())) {
if(children != null){
node.put("children",children);
}
jsonArray.set(i,node);
return;
}else if(children != null){
updateRecursive(children,key,value,node);
}
}
} /**
* 删除节点
* @param jsonArray 需要更新的目标主体
* @param key 目标主体中的字段名key
* @param value 节点信息与key对应的value
*/
public static void removeRecursive(JSONArray jsonArray,String key,Object value) {
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
if (value.toString().equals(jsonObject.get(key).toString())) {
jsonArray.remove(jsonObject);
return;
}
JSONArray children = jsonObject.getJSONArray("children");
if (children != null) {
removeRecursive(children,key,value);
}
}
} }

json字符串转换成json增删查改节点的更多相关文章

  1. json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值

    一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想的数据交换格式. 同时,json是jav ...

  2. 特殊字符导致json字符串转换成json对象出错

    在对数据库取出来的数据(特别是描述信息)里面含有特殊字符的话,使用JSON.parse将json字符串转换成json对象的时候会出错,主要是双引号,回车换行等影响明显,左尖括号和右尖括号也会导致显示问 ...

  3. JavaScript:将key和value不带双引号的JSON字符串转换成JSON对象的方法

    遇到相关的问题,花了两天的时间来解决,深感来之不易,所以做如下的总结,希望遇到此问题的码农能更快的找到解决办法! var jsonArr= [{col:TO_CHAR(HZRQ,'YYYYMM'),t ...

  4. js中把JSON字符串转换成JSON对象最好的方法

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用j ...

  5. js中将json字符串转换成json对象

    在我们使用js请求后台控制器传回的结果result值的时候,经常会出现返回结果值为json字符串的情况,字符串无法在js中直接使用 返回样式栗子: 这是一个json字符串:result = " ...

  6. [转载]将json字符串转换成json对象

    例如: JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; J ...

  7. JSON字符串转换成JSON对象

    字符串转对象(strJSON代表json字符串) var obj = eval(strJSON); var obj = strJSON.parseJSON(); var obj = JSON.pars ...

  8. JS 解决json字符串转换成json树形输出

    问题: 后台获取一个字符串,格式为  string +jsonList+string+..... 就是传过来一堆数据,然后其中包含了一个json格式的list, 我们希望能将它输出成树形结构显示,能够 ...

  9. C#,json字符串转换成Json对象

    将JSON的请求参数转化为C#可序列化对象! JSON请求参数: "{\"id\":1,"name":"张三","dep ...

随机推荐

  1. 在mac上进行JAVA开发

    一.  JDK 的下载与安装 终端输入java看看有没有安装java: 见到此弹窗,说明没有安装呀! 点击oracle官网链接: http://www.oracle.com/technetwork/j ...

  2. 主席树+二分 p4602

    题意:给出每一种果汁的美味度,价格,升数: m个询问,每个询问给出最高上限的钱g,以及给出最少的w 意思是,最多用g的钱去买最少l的果汁,问能得到的最大美味度: 美味度是取所有果汁中美味度的最小值: ...

  3. IDE - IDEA - tab - 方法相关的移动

    1. 概述 标题可能会改 一个 tab 里方法相关的操作 2. 前提 以默认的模式编辑 tab 对我来说, 就关掉 vim 插件 3. 操作 1. 查看文件结构 概述 唤出当前文件的 结构 唤出后可以 ...

  4. 【Vue CLI】从安装到构建项目再到目录结构的说明

    目录 1. 构建我们的项目 2. 目录结构说明 2.1 build目录 2.2 config目录 2.3 src目录 2.4 static目录 "Vue CLI是一个基于Vue.js进行快速 ...

  5. .Net Core 2.0 App中读取appsettings.json

    引用: Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.FileExtensionsMicrosoft.Ext ...

  6. ‘\0’的ASCII码

    1.'\0'的ASCII码为0 2.用串口发送字符串时,可以通过'\0'判断字符串是否结束,但发送数字数组的时候不能通过'\0'判断数组是否结束,因为数字0与'\0'的ASCII码值相同.

  7. C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数

    原始C语言: #include<stdio.h> void main(){ ]; char pipei[] = "abcdefghijklmnopqrstuvwxyz" ...

  8. HashMap遍历,取出key和value

    HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,在用keySet(key)取value时候,需要key 第一种: Map map = new HashMap( ...

  9. 【MySQL】完整性约束

    " 目录 not null default unique 单列唯一 联合唯一 primary key 单列主键 复合主键 auto_increment 步长与偏移量 foreign key ...

  10. IE浏览器清浮动

    .cfx:after,.cfx:before{content:" ";display:table;}.cfx:after{clear:both;}.cfx{*zoom:1;} 今天 ...