最近了解到使用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. C、C++、C#中struct的简单比较

    比较这三者是因为C.C++.C#这三者存在着一定的血缘关系,而他们三者都有的struct却有很大的不同. 功能 C中的struct是最简单的.只能有成员变量而不能有成员函数. C++和C#中都支持,而 ...

  2. Unity runtime性能分析器

    一. Profiler: 1. CPU Usage A. WaitForTargetFPS: Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间 B. Overhead: Profiler总体 ...

  3. PAT (Basic Level) Practise (中文)- 1011. A+B和C (15)

    http://www.patest.cn/contests/pat-b-practise/1011 给定区间[-231, 231]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1 ...

  4. lua 使用正则表达式分割字符串

    function string_split(str, delimiter) if str == nil or str == '' or delimiter == nil then  return ni ...

  5. skynet 学习笔记-sproto模块(2)

    云风在skynet中继承了sproto的传输协议,对比protobuf的好处是,能明文看到传输内容,而且skynet不需要protobuf这么功能,所以云风也建议在lua层使用sproto来作为sky ...

  6. 使用jsp读取某个目录下的所有文件名,并保存在json文件中

    <%@page import="java.io.File"%> <%@page import="java.io.FileWriter"%> ...

  7. OC和C++的混用1

    //Objective-C类 /*在混用之前需要做一步非常重要的事:不是代码而是编译器选项,在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++. 修 ...

  8. 66. Plus One@python

    Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...

  9. 【思维题 集合hash 树上差分】11.5撸树

    要注重问题的转化和一些结论的推断 题目描述 要致富,先撸树. 一棵树的形状可以简化为一张 $N$ 个点 $M$ 条边的图,由于装备条件限制,你只有撸两次,也就是删去两条边,当这张图不联通时,就意味着树 ...

  10. linux关于yum

    yum仓库设置:1.cd /etc/yum.repos.d yum仓库 2.CentOS-Base.repo 网络源 CentOS-Media.repo 光盘源 设置 vi CentOS-Media. ...