JSON树节点的增删查改

最近了解到使用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=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即可,不过这里以单一条件的匹配,能正常实现也能应对需要匹配其他字段的情况

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

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于Java操作本地JSON增删改查问题。 在Java中,可以使用第三方库`json`来操作JSON数据,需要在项目中引入该库。 以下是Java中操作本地JSON增删改查示例代码: 1. 增加JSON数据: ```java JSONObject jsonObject = new JSONObject(); jsonObject.put("name", "张三"); jsonObject.put("age", 20); jsonObject.put("gender", "男"); jsonObject.put("hobby", new JSONArray(Arrays.asList("basketball", "football"))); String jsonString = jsonObject.toString(); // 将jsonString写入本地文件中 ``` 2. 删除JSON数据: ```java // 从本地读取JSON数据 String jsonStr = FileUtils.readFromFile("data.json"); JSONObject jsonObject = new JSONObject(jsonStr); jsonObject.remove("hobby"); String jsonString = jsonObject.toString(); // 将jsonString写入本地文件中 ``` 3. 修改JSON数据: ```java // 从本地读取JSON数据 String jsonStr = FileUtils.readFromFile("data.json"); JSONObject jsonObject = new JSONObject(jsonStr); jsonObject.put("age", 25); String jsonString = jsonObject.toString(); // 将jsonString写入本地文件中 ``` 4. 查询JSON数据: ```java // 从本地读取JSON数据 String jsonStr = FileUtils.readFromFile("data.json"); JSONObject jsonObject = new JSONObject(jsonStr); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age"); JSONArray hobby = jsonObject.getJSONArray("hobby"); ``` 其中,`FileUtils`是一个自定义的文件操作工具类,用于读写本地文件。 希望这些代码能够帮助您完成本地JSON数据的增删改查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值