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

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

介绍一下我使用的依赖

<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=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(www.dfgjpt.com); i++) {JSONObject jsonObject =body.getJSONObject(i);if (jsonObject.get(key).toString(www.thd540.com).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("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(); 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(www.089188.cn/); i++) {JSONObject jsonObject =body.getJSONObject(i);if (jsonObject.get(key).toString(www.mhylpt.com).equals(value.toString(www.fengshen157.com/))) {if(isKeep)result.put("children", jsonObject.getJSONArray("children"));body.set(i,www.dasheng178.com 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", "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, "id", 6, tree9, false);
System.out.println(getNode(details, "id",6 ,new JSONObject()));

以上,为简单的增删查改,根据业务不同会有不同的更改。

虽然业务要求匹配ID即可,不过这里以单一条件的匹配,能正常实现也能应对需要匹配其他字段的情况

每个人的实现方式不同,这里仅是我个人的思路与实现,仅供参考。

新人一枚,如有疑问或建议,欢迎提出!

JSON树节点的增删查改相关推荐

  1. Tree树状图的动态增删查改(上)生成树状图

    一.刚学习项目里就有使用到树状图这个功能,树状图这个功能是要用到插件才能做的,我目前发现有两个插件的样式是比较好看的,一个是Layui里面自带的树组件,不过它的文档写的挺少的,而且看不懂:另一个是jq ...

  2. [QML][Json] QML下Json操作扩展(增删查改)

    QML下Json操作扩展(增删查改) 具体代码实现如下链接: https://github.com/Asa-gc/SUTL/blob/main/src/qml/func/MyJson/MyJson.j ...

  3. 数据结构:二叉搜索树的增删查改

    二叉搜索树的增删查改 二叉搜索树(Binary Search Tree) 基本操作之查找(Update) 基本操作之修改(Update) 基本操作之增加(Create) 基本操作之删除(Delete) ...

  4. 数据库mysql增删查改操作指令

    1.基础操作 MySQL服务器->许多数据库->许多数据表-> 指定表头,表头描述了列名和列类型-> 每行为一个记录,每列为一个字段 数据类型:tinyint(1字节),sma ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 看过上一篇,相信大家都会知道如何开启mongodb了,这篇就细说下其中的增删查改,首先当我们用上一篇同样的方式打开mongod ...

  6. 【C++ 语言】vector 容器 ( 容器分类 | vector 声明 | vector 初始化 | vector 容器元素增删查改 )

    文章目录 序列式容器 vector 简介 vector ( 向量 ) 头文件 vector ( 向量 ) 声明及初始化 vector ( 向量 ) 添加元素 vector ( 向量 ) 查询元素 ve ...

  7. 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  8. 单链表的增删查改等基本操作C++实现

    单链表的初始化.增删查改.遍历一次找中间结点.删除一个无头单链表的非尾结点(不给头结点) #include<stdio.h> #include<stdlib.h> #inclu ...

  9. xml02 XML编程(CRUD)增删查改

    XML解析技术概述 Demo2.java import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuil ...

最新文章

  1. IASetIndexBuffer Offset
  2. DL之CNN:计算机视觉之卷积神经网络经典算法简介、重要进展、改进技巧之详细攻略(建议收藏)
  3. C语言--冒泡法实现
  4. 阿里云SAG2.0发布,助力企业全球互联
  5. Java实现XSS防御
  6. bootstrap菜单展开收起_基于bootstrap的后台左侧导航菜单和点击二级菜单刷新二级页面时候菜单展开显示当前菜单...
  7. 华为机试——求int型正整数在内存中存储时1的个数
  8. Oracle11g导出空表解决方法
  9. JavaScript 教程 (详细 全面)
  10. Android小白从零开始学Android开发的要点总结(内含福利)
  11. 【Qt】绘制CIE色度图
  12. bugku——宽带信息泄露(RouterPassView 查看路由器配置信息)
  13. 拼多多推广效果不好,哪里需要改善?
  14. tiup telemetry
  15. Pycharm放大缩小,快捷键控制
  16. 电信ZNHG60光猫信息虚标
  17. 关于Linux mint更换中文字体后全局楷体修改办法
  18. linux框架下搭建orl,DevOps和自动化运维实践/Linux\Unix技术丛书
  19. ubuntu下修改mysql密码
  20. ios .mm文件调用c语言函数报错,深入浅出 iOS 编译

热门文章

  1. 解决流氓软件自动下软件、自动弹窗、广告
  2. ubuntu系统怎么看电脑配置
  3. GLES2.0中文API-glCopyTexImage2D
  4. 浅谈一下刚学的Java集合
  5. 调试OTM4001A液晶驱动的一点心得
  6. v-chart 自定义显示格式
  7. 梅科尔工作室-江凌宇-鸿蒙笔记3
  8. 致敬达叔!Python带你回顾达叔出演过的作品与合作过的演员
  9. docker(17):使用docker构建nginx+phpfpm环境2
  10. 网狐获取服务器信息,网狐服务端扩展业务接口手册