最近了解到使用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. word中在空白处加下划线不显示解决

    终极解决:Ctrl + Shift + Space Alt + 选择,竖向选择.和VS,其他一些编辑器一样

  2. Bootstrap标签页(Tab)插件

    标签页(Tab)在Bootstrap导航元素一章中简介过,通过结合一些data属性,您可以轻松地创建一些标签页界面.通过这个插件您可以把内容放置在标签页或胶囊式标签页甚至是下拉菜单标签页中. 用法 您 ...

  3. HTML5中Web存储

    HTML5 中web存储是一个比cookies更好的一个本地存储方式. 那么什么是HTML5存储呢? 使用HTML5可以在本地存储用户浏览的数据,HTML5技术没有出来之前是使用cookies进行本地 ...

  4. dht 分布式hash 一致性hash区别

    先有一致性hash :一致性哈希,似乎最早提出是在分布式缓存里面的,让节点震荡的时候,影响最小.不过现在已经应用在分布式存储和p2p系统里面. dht 是p2p领域的概念,内有三大概念是由keyspa ...

  5. Spring学习笔记之Spring概述

    概述   Spring是一个java应用最广的开源框架,它是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...

  6. CF-1093 (2019/02/10)

    CF-1093 1093A - Dice Rolling 输出x/2即可 #include<bits/stdc++.h> using namespace std; int main() { ...

  7. 标准C++(3)重载

    一.函数的重载 c++中同一作用域下能够定义同名的函数(这就叫重载),但必须满足如下要求: 1.函数的参数列表必须不同,可以使参数数量不同,也可以使参数的类型不同,甚至是参数的顺序不同. 2.函数的返 ...

  8. centos7重启后/etc/resolv.conf 被还原解决办法

    每次重启服务器后,/etc/resolv.conf文件就被自动还原了,最后发现是被Network Manager修改了. 查看Network Manager服务状态 systemctl status ...

  9. 如何用 CSS 和 D3 创作旋臂粒子动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJrOqd 可交互视频 ...

  10. 能力不足之 根据时序图转化为Verilog代码

    不能够把时序图看的非常透彻,然后把时序图写成Verilog代码,有时候甚至搞不清楚信号之间的时序关系.