zoukankan      html  css  js  c++  java
  • json字符串转换成json增删查改节点

    一、功能实现

    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);
                }
            }
        }
    
    }
    
  • 相关阅读:
    JavaFX学习曲线日记2:声明用户接口
    深入学习JavaFX脚本语言
    JavaFX学习曲线日记2:声明用户接口
    JavaFX学习曲线日记1:探索JavaFX脚本
    深入学习JavaFX脚本语言
    略谈数学中的映射在其它领域的踪迹
    Using Swing's Pluggable Look and Feel
    JavaFX学习曲线日记1:探索JavaFX脚本
    赖勇浩:应对多核编程革命
    Using Swing's Pluggable Look and Feel
  • 原文地址:https://www.cnblogs.com/slivelove/p/9862260.html
Copyright © 2011-2022 走看看