最近了解到使用json字符串存到数据库的一种存储方式,取出来的json字符串可以进行相应的节点操作

故借此机会练习下递归,完成对json节点操作对应的工具类。

介绍一下我使用的依赖

复制代码
     <!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
复制代码
主要使用JSONObject和JSONArray的API进行相关操作,这里附上这两个类的代码

JSONObject
JSONArray
一些数据转换的API

JSONArray.parseArray("json树字符串")-----------可以返回JSONArray对象

jsonArray对象.toJSONString()------------------------可以转换为字符串便于存入数据库

首先我们需要有一个json树,这里可以自己编写,跟数据库操作的相关方法暂不涉及,这里直接使用相关API搭建,在main方法中

复制代码
public static void main(String[] args) {
JSONArray details=new JSONArray();
JSONObject tree1=new JSONObject();
tree1.put("id",1);
tree1.put("code", "taosir");
tree1.put("name", "taosir");
JSONObject tree2=new JSONObject();
tree2.put("id",2);
tree2.put("code", "moer");
tree2.put("name", "moer");
JSONArray array1=new JSONArray();
array1.add(tree1);
array1.add(tree2);
JSONObject tree3=new JSONObject();
tree3.put("id",3);
tree3.put("code", "xixi");
tree3.put("name", "xixi");
tree3.put("children", array1);
JSONObject tree4=new JSONObject();
tree4.put("id",4);
tree4.put("code", "jack");
tree4.put("name", "jack");
JSONArray array2=new JSONArray();
array2.add(tree3);
array2.add(tree4);
JSONObject tree5=www.fengshen157.com/ new JSONObject();
tree5.put("id",5);
tree5.put("code", "lay");
tree5.put("name", "lay");
tree5.put("children", array2);
JSONObject tree6=new JSONObject();
tree6.put("id",6);
tree6.put("code", "haer");
tree6.put("name", "haer");
details.add(tree5);
details.add(tree6);
System.out.println(details);
}
复制代码

生成的json树
点击上面可以查看生成的json树

OK,准备工作完毕,下面进行功能演示。

(注意,每演示一个功能点,请注释掉其他的打印语句)

首先是查询:

复制代码
/**
* 根据单一条件获取节点位置
* @param body 查询目标的主体内容
* @param key 筛选匹配条件条件对应--key
* @param value 筛选匹配条件对应--value
* @param result 缓存查询结果
* @return
*/
public static JSONObject getNode(JSONArray body,String key,Object value,JSONObject result) {
for (int i = 0; i < body.size(); i++) {
JSONObject jsonObject =body.getJSONObject(i);
if (jsonObject.get(key).toString().equals(value.toString())) {
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
result.put(entry.getKey(), entry.getValue());
}
}else if(jsonObject.getJSONArray("children")!=null) {
getNode(jsonObject.getJSONArray("children"), key, value,result);
}
}
return result;
}
复制代码
在main方法调用演示,将前面的打印注释掉

//System.out.println(details);
System.out.println(getNode(details, "id", 4,new JSONObject()));

查询写出来,基本思路对了,其他的操作都类似,简单得多

下面是添加

复制代码
/**
*
* @param body 需要添加的目标树主体
* @param key 筛选匹配条件对应的key
* @param value 筛选匹配条件的值
* @param index 需要插入的下标位置索引
* @param node 插入的整体节点
*/
public static void addNode(JSONArray body,String key,Object value,int index,JSONObject node) {
for (int i = 0; i < body.size(); i++) {
if("id".equals(key)&&"0".equals(value.toString())) {
body.add(index, node);
break;
}
JSONObject jsonObject =body.getJSONObject(i);
if (jsonObject.get(key).toString().equals(value.toString())) {
jsonObject.getJSONArray("children").add(index, node);
}else if(jsonObject.getJSONArray(www.tygj178.com"children")!=null) {
addNode(jsonObject.getJSONArray("children"), key, value,index,node);
}
}
}
复制代码
复制代码
System.out.println(getNode(details, "id",6 ,new JSONObject()));
JSONObject tree7=new JSONObject();
tree7.put("id",7);
tree7.put("code", "bom");
tree7.put("name", "bom");
addNode(details, "id", 6, 0, tree7);
System.out.println(getNode(details, "id",6 ,new JSONObject()));
复制代码

可以看到,当节点位置没有子节点时,默认追加,这个时候需要传0,没有考虑越界,可以弄自定义异常处理

复制代码
System.out.println(getNode(details, "id",6 ,new JSONObject()));
JSONObject tree8=new JSONObject();
tree8.put("id",8);
tree8.put("code", "naonao");
tree8.put("name", "naonao");
addNode(details, "id", 6, 0, tree8);
System.out.println(getNode(details, "id",6 ,new JSONObject()));
复制代码

这种是已经有节点的情况,可以看到为直接插入索引位置

下面是删除,不保留孩子节点:

复制代码
/**
* 根据单一条件删除节点
* @param body 需要删除的目标主体
* @param key 筛选匹配条件对应的key
* @param value 筛选匹配条件对应的value
*/
public static void delNode(JSONArray body,String key,Object value) {
for (int i = 0; i < body.size(www.caitianxia178.com); i++) {
JSONObject jsonObject =body.getJSONObject(i);
if (jsonObject.get(key).toString().equals(value.toString())) {
body.remove(i);
break;
}else if(jsonObject.getJSONArray("children")!=null) {
delNode(jsonObject.getJSONArray("children"), key, value);
}
}
}
复制代码
System.out.println(getNode(details, "id",6 ,new JSONObject()));
delNode(details, "id", 8);
System.out.println(getNode(details, "id",6 ,new JSONObject()));

可以看到刚才加入的节点(id=8)已经被成功删除

下面是修改,可以选择是否保留孩子节点

复制代码
/**
* 根据单一条件修改节点
* @param body 需要修改的目标主体
* @param key 筛选匹配条件对应的key
* @param value 筛选匹配条件对应的value
* @param result 修改节点信息
* @param isKeep 是否保留孩子节点
*/
public static void updateNode(JSONArray body,String key,Object value,JSONObject result,boolean isKeep) {
for (int i = 0; i < body.size(); i++) {
JSONObject jsonObject =body.getJSONObject(i);
if (jsonObject.get(key).toString().equals(value.toString())) {
if(isKeep)
result.put("children", jsonObject.getJSONArray("children"));
body.set(i, result);
break;
}else if(jsonObject.getJSONArray("children")!=null) {
updateNode(jsonObject.getJSONArray("children"), key, value,result,isKeep);
}
}
}
复制代码
当需要保留孩子节点时:

复制代码
System.out.println(getNode(details, "id",6 ,new JSONObject()));
JSONObject tree9=new JSONObject();
tree9.put("id",6);
tree9.put("code", "bom");
tree9.put("name", www.xinghenyule.com "bom");
updateNode(details, "id", 6, tree9, true);
System.out.println(getNode(details, "id",6 ,new JSONObject()));
复制代码

当不需要保留孩子节点时:

复制代码
System.out.println(getNode(details, "id",6 ,new JSONObject()));
JSONObject tree9=new JSONObject();
tree9.put("id",6);
tree9.put("code", "bom");
tree9.put("name", "bom");
updateNode(details, www.dfgjpt.com "id", 6, tree9, false);
System.out.println(getNode(details, "id",6 ,new JSONObject()));

JSON树节点的增删查改的更多相关文章

  1. json字符串转换成json增删查改节点

    一.功能实现 1.节点树查询: 按ID查询树 2.节点新增: http://host/tree_data/node/${treeId} in: {node: {key: ..., ...}, pare ...

  2. golang使用json格式实现增删查改

    需求和思路 在一般的小项目或者一个小软件,例如客户端之类的小程序中,可能会需要数据的持久化.但是使用一般的数据库(Mysql)之类的不合适.使用sqlite3这种嵌入式的是个较好的方法,但是Go语言中 ...

  3. 极极极极极简的的增删查改(CRUD)解决方案

    去年这个时候写过一篇全自动数据表格的文章http://www.cnblogs.com/liuyh/p/5747331.html.文章对自己写的一个js组件做了个概述,很多人把它当作了一款功能相似的纯前 ...

  4. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  5. backbonejs mvc框架的增删查改实例

    一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https://github.com/nonocast/e ...

  6. 8天学通MongoDB——第二天 细说增删查改

    原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/02/19/2357846.html 看过上一篇,相信大家都会知道如何开启mongodb了 ...

  7. EasyUI的增删查改(后台ASP.NET)

    转自:http://www.cnblogs.com/dedeyi/archive/2013/04/22/3035057.html 某某人曾经跟我说,你们做系统不就是增删查改吗. 是啊,很多时候我们就是 ...

  8. 一套手写ajax加一般处理程序的增删查改

    倾述下感受:8天16次驳回.这个惨不忍睹. 好了不说了,说多了都是泪. 直接上代码 : 这个里面的字段我是用动软生成的,感觉自己手写哪些字段太浪费时间了,说多了都是泪 ajax.model层的代码: ...

  9. SSH框架的多表查询和增删查改 (方法一)中

    原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>http://www.cnblogs.com/zhu520/p/7774144.html   这边文章是接的刚刚前一遍的基础上敲的  ...

随机推荐

  1. UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)

    由于互相憎恨的骑士不能相邻,把可以相邻的骑士连上无向边,会议要求是奇数,问题就是求不在任意一个简单奇圈上的结点个数. 如果不是二分图,一定存在一个奇圈,同一个双连通分量中其它点一定可以加入奇圈.很明显 ...

  2. cv2.minAreaRect() 生成最小外接矩形

    简介   使用python opencv返回点集cnt的最小外接矩形,所用函数为 cv2.minAreaRect(cnt) ,cnt是所要求最小外接矩形的点集数组或向量,这个点集不定个数.   cv2 ...

  3. Stream great concerts wherever you are

    This time of year, we take stock of what we're thankful for — and above all else, we’re thankful for ...

  4. PAT (Basic Level) Practise (中文)-1039. 到底买不买(20)

    PAT (Basic Level) Practise (中文)-1039. 到底买不买(20) http://www.patest.cn/contests/pat-b-practise/1039 小红 ...

  5. 基于GPS\北斗、GIS、GPRS技术构建智能巡检系统

    巡线工负责输油管网设施的日常巡查,可以及时发现管网设施是否完好.但巡检工作辛苦,加之管线在大部分情况下又处于良好状态,使得巡检人员麻痹大意,往往不能按规定程序进行巡检,造成巡检不到位,这样就不能从根本 ...

  6. Linux curl 详解

    Linux下载工具Curl也是Linux下不错的命令行下载工具,小巧.高速,唯一的缺点是不支持多线程下载.以下是他的安装和功能. 安装 $ tar zxvf curl-7.14.0.tar.gz $ ...

  7. pandas关联mysql并读写数据库

    1.代码读写mysql,必须安装关联mysql的工具 操作如下命令: sudo apt-get install mysql-server mysql-clientsudo apt-get instal ...

  8. Helm入门

    前言:Helm是GO语言编写的,是管理kubernetes集群中应用程序包的客户端工具.Helm是类似于centos上的yum工具或Ubuntu上的apt-get工具.对于应用发布者而言,可以通过He ...

  9. k8s资源指标API及metrics-server资源监控

    简述: 在k8s早期版本中,对资源的监控使用的是heapster的资源监控工具. 但是从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics API 获取资源使用指标,例如 ...

  10. vue里的数据

    背景: 一个项目完工在即,鉴于此,前端使用了vue,写下此栏,以供日后翻阅, 会涉及到我所运用到的vue相关知识,需要一定的js基础. 默认vue的single-file-components(单文件 ...