最近了解到使用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. 为Oracle Clusterware修改公用及私有网络接口

    出于种种原因我们可能需要为已安装的Oracle集群软件修改其使用的公用或私有网络所使用的网络接口(How to Change Interconnect/Public Interface IP or S ...

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

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

  3. 换个语言学一下 Golang (3)——数据类型

    在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...

  4. 使用Process组件访问本地进程

    实现效果; 知识运用: Process组件的StartInfo属性 //获取或设置要传递给Process的Start方法的属性 public ProcessStartInfo StartInfo {g ...

  5. 总结一下自己脑海里的JavaScript吧(一)--DOM模型

    今天是2019年6月25日,闲来无事,写一篇文章来看看自己脑袋里装了多少JavaScript知识! 这儿就第一章: 说起JavaScript,它是什么?后端脚本语言?前端编程语言?还是在网站浏览器上运 ...

  6. 解决vs 编译的bug“请检查是否是磁盘空间不足、路径无效或权限不够”

    昨晚用vs编译遇到一个问题,编译一半发现硬盘没空间,一直重启vs,重启电脑, 删除pdb文件都没用,之后尝试重新生成解决方案,就解决了.这个是vs的一个bug

  7. Mac配置gdb的一些问题

    1.Unable to find Mach task port for process-id 1527: (os/kern) failure (0x5).   (please check gdb is ...

  8. HashMap与ArrayMap(和SparseArray)的比较与选择

    HashMap与ArrayMap(和SparseArray)的比较与选择 2017年12月26日 06:04:38 阅读数:61 标签: androidjavahashmaparraymap数据结构 ...

  9. 编译-LAMP基于fastcgi

    前言 最近没更新新篇幅了,今天就来点干活,过多的也不说了下面着手干!干!干! 准备环境 centos7.5 apr-1.6.3.tar.gz  apr-util-1.6.1.tar.gz      h ...

  10. 标准C++(1)

    一.引用 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 例: int& num; 引用类似于起别名 注 ...