如何获取json某一级节点的数据

最近做项目有获取和设置固定格式某一级节点值的需求。但是要一级一级地取对于多级的结构来说代码过于冗余且重复,于是写了个递归的方法根据json路径完成值的定点操作。废话不多说直接贴代码。

    /**
* 通用的 通过json路径找到json值
* @param jsonObject 要取值的json对象
* @param path 对象路径
* @return 对象值列表 由于可能存在A.B.C路径中B为列表的情况,所以结果可能有多个
*/
public static List<Object> getJsonFieldValue(JSONObject jsonObject, String path) {
List<String> keyWordList = new ArrayList(Arrays.asList(path.split("\\.")));
List<Object> list = new ArrayList<>();
String key = keyWordList.get(0);
Object object = jsonObject.get(key);
keyWordList.remove(0);
if (keyWordList.isEmpty()) {
if (null != object) {
list.add(object);
}
return list;
} String subPath = StringUtils.join(keyWordList, ".");
if (object instanceof JSONArray) {
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(object));
if (jsonArray.isEmpty()) {
return new ArrayList<>();
}
jsonArray.forEach(e -> list.addAll(getJsonFieldValue(JSON.parseObject(JSON.toJSONString(e)), subPath)));
}else if(object instanceof JSONObject){
JSONObject subJsonObject = JSONObject.parseObject(JSON.toJSONString(object));
list.addAll(getJsonFieldValue(JSON.parseObject(JSON.toJSONString(subJsonObject)), subPath));
}
return list;
} /**
* 通用的 通过json路径找到json值
* @param jsonObject 要取值的json对象
* @param path 对象路径
* @param value 要设置的值
* @return 修改后的对象
*/
public static Object setJsonFieldValue(JSONObject jsonObject, String path, Object value) {
List<String> keyWordList = new ArrayList(Arrays.asList(path.split("\\.")));
String key = keyWordList.get(0);
keyWordList.remove(0);
//如果关键词为空,说明此处为目标点,设置值
if (keyWordList.isEmpty()) {
jsonObject.fluentPut(key,value);
return jsonObject;
}
//关键词不为空,取出子jsonObject进行递归
Object object = jsonObject.get(key); String subPath = StringUtils.join(keyWordList, ".");
if (object instanceof JSONArray) {
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(object));
if (jsonArray.isEmpty()) {
//说明不是目标点,原样返回
return object;
}
JSONArray newArray = new JSONArray();
jsonArray.forEach(e -> newArray.add(setJsonFieldValue(JSON.parseObject(JSON.toJSONString(e)), subPath,value)));
jsonObject.fluentPut(key,newArray);
}else if(object instanceof JSONObject){
JSONObject subJsonObject = JSONObject.parseObject(JSON.toJSONString(object));
jsonObject.fluentPut(key,setJsonFieldValue(JSON.parseObject(JSON.toJSONString(subJsonObject)), subPath,value));
}
return jsonObject;
}

如何获取json某一级节点的数据的更多相关文章

  1. 获取Json数据某节点的值

    时间匆忙,直接上代码,回家还得做清蒸鱼呢! #region 获取Json字符串某节点的值 /// <summary> /// 获取Json字符串某节点的值 /// </summary ...

  2. zTree实现获取一级节点数据

    zTree实现获取一级节点数据 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</t ...

  3. .Net Core中获取appsettings.json中的节点数据

    获取ConnectionStrings节点数据 //appsettings.json { "ConnectionStrings": { //DEV "DbConn&quo ...

  4. Netflix Falcor获取JSON数据

    Netflix开源了JavaScript库Falcor,它为从多个来源获取JSON数据提供了模型和异步机制. Netflix利用Falcor库实现通过JSON数据填充他们网页应用的用户界面.所有来自内 ...

  5. 循环(数组循环、获取json数据循环)、each()循环详解

    return; // 退出循环(不满足,退出此次循环.下次满足条件,依然会走此循环)return false; //退出函数(退出所有) 一. 数组循环: html: <div class=&q ...

  6. ajax获取json数据 for select2

    json数据“a.json” [ { "id": "1", "text": "张三" }, { "id&quo ...

  7. 获取json数据

    通过异步获取json来展示数据表格,性能提高不少.实例如下: 前台: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...

  8. qt qml ajax 获取 json 天气数据示例

    依赖ajax.js类库,以下代码很简单的实现了获取天气json数据并展示的任务 [TestAjax.qml] import QtQuick 2.0 import "ajax.js" ...

  9. angularJS获取json数据(实战)

    学习了这么多天的AngularJS,今天想从实战的角度和大家分享一个简单的Demo--用户查询系统,以巩固之前所学知识.功能需求需要满足两点 1.查询所有用户信息,并在前端展示 2.根据id查询用户信 ...

随机推荐

  1. 在ASP.NET 中有哪些数据验证控件(请解释ASP.NET中以什么方式进行数据验证)?

    (1)RequiredFieldValidator:检查用户是否输入: (2)CompareValidator:检查两个表单输入项的输入信息是否存在某种指定关系,比如大.等于等: (3)RangeVa ...

  2. java基础-循环标签

    outer: for innter: for break outer//跳出整个循环: continue outer//结束本次外循环的循环 break inner; continute inner; ...

  3. python文件处理-将图像根据坐标切割成若干小图

    代码涉及到:遍历目标路径,选取csv后缀的文件,遍历csv每一行,读取坐标,用cv操作图片 # !/usr/bin/python # -*- coding: UTF- -*- import panda ...

  4. 模拟elementUI或使用自定义属性简单封装对话框

    前言 现在前端框架有许多的UI框架可以选择,但是样式或者功能不一定是我们项目中想要的,因此很多时候需要自己封装.此篇文件简单介绍一下利用自定义标签或者自定义扩展属性来封装UI组件,方便项目的其他地方复 ...

  5. css使用rgba()或hsla()设置半透明或完全透明边框border

    在css中我们想实现透明颜色,首先就会想到rgba()和hsla()这2个属性.这篇文章就简单介绍下使用这2种方式来实现半透明边框. 1.使用rgba方式: border: 10px solid rg ...

  6. Mariadb之复制过滤器

    mariadb的主从复制集群,默认情况下是把主库上的所有库进行复制,只要在主库上产生写操作,从库基于主库的二进制日志做重放,从而实现把主库的上的库表复制到从库:复制过滤器指的是我们仅复制一个或几个数据 ...

  7. 状压DP之愤怒的小鸟

    题目 传送们P2831 题目较长,不加以赘述 直接步入正题 首先是数学知识,我们可以先根据给出的任意两只猪构建相应的抛物线,同时再构建完之后应判断抛物线的合法性(比如a小于0啊,等等),公式推演就不在 ...

  8. USTC信息安全期末重点

    一.ARP协议问题1. ARP协议的作用是什么.地址解析协议,即IP地址和MAC地址之间的转换. 2. 引入ARP缓存的功能是什么.将这一映射关系保存在 ARP 缓存中,使得不必重复运行 ARP 协议 ...

  9. day72 bbs项目☞登录注册

    目录 一.表创建及同步 二.注册功能 二.登录页面搭建 一.表创建及同步 from django.db import models from django.contrib.auth.models im ...

  10. day18 作业

    目录 1.编写课上讲解的有参装饰器准备明天默写 2.在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作 3.编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017- ...