json字符串插入节点或者覆盖节点
jfdaJson是json字符串
1
2
3
4
|
JSONObject obj=JSONObject.parseObject(jfdaJson); obj.put( "dj" ,xydjDm); // 更新dj字段 obj.put( "xydjMc" ,xydjMc); // 添加xydjMc字段 obj.toString(); |
json字符串转换成json增删查改节点
一、功能实现
1、节点树查询:
按ID查询树
2、节点新增:
1
2
|
http://host/tree_data/node/${treeId} in: {node: {key: ..., ...}, parent: ${key}, sequ: ${sequ}} |
3、节点修改
1
2
|
http://host/tree_data/node/${treeId}/${key} in: {node: {key: ..., ...}} |
4、节点删除
1
|
http://host/tree_data/node/${treeId}/${key} |
二、数据表结构
1
2
3
4
5
6
7
8
9
|
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字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
[{ "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文件依赖
1
2
3
4
5
|
< dependency > < groupId >com.alibaba</ groupId > < artifactId >fastjson</ artifactId > < version >1.2.49</ version > </ dependency > |
五、controller层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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层
1
2
|
JSONArray jsonArray = JSON.parseArray(jsonTree); //由json字符串变成json数组对象 jsonArray.toJSONString() //由json数组对象变成json字符串 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
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); } } |
七、把增删查改的递归方法写成工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
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); } } } } |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/zhangrui1037102215/article/details/80619398