如何获取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. 3、尚硅谷_SSM高级整合_创建Maven项目.avi

    Maven中dependencyManagement作用说明 在Maven多模块的时候,管理依赖关系是非常重要的,各种依赖包冲突,查询问题起来非常复杂,于是就用到了<dependencyMana ...

  2. disruptor架构一

    Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现. 在使用之前,首先说明disruptor主要功能加 ...

  3. Redis:缓存淘汰策略

    将redis用做缓存是一种非常常见的手段,然而由于内存大小的限制,会导致redis在内存空间满了以后需要处理继续存入的数据.总计有以下几种策略: volatile-ttl:在设置了过期时间的数据集里, ...

  4. 并发编程,python的进程,与线程

    并发编程 操作系统发展史 基于单核研究 多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 切换+保存状态 例子:洗衣 烧水 做饭 切换 1.程序遇到IO操作系统会立刻剥夺走CP ...

  5. laravel --- composer install之后,项目没有vender目录

    composer install之后,项目没有vender目录 1. 原因一:PHP版本过低 PHP版本需要7.1以上,目前使用的是7.0.23

  6. C#数据结构与算法系列(十九):选择排序算法(SelectSort)

    1.介绍 选择排序算法属于内部排序算法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置达到排序的目的 时间复杂度:O(n^2) 双层for 2.思想 选择排序(select sorti ...

  7. mssql 手工注入流程小结

    对于MSSQL的注入点,无外乎这三种权限:SA,DB_OENER,PUBLIC.SA(System Admin)权限我们可以直接执行命令,DB_OENER权限的话,我们可以找到WEB的路径,然后用备份 ...

  8. List集合-03.Vector

    3.Vector 3.1 UML图 3.2 Vector的特点 Object的数组存储元素 默认初始大小为10 public Vector() { this(10); } 线程安全,可以看到所有的数据 ...

  9. 【线型DP】洛谷P2066 机器分配

    [线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...

  10. 一文了解HAProxy主要特性

    本文转自Rancher Labs 在Kubernetes中,Ingress对象定义了一些路由规则,这些规则规定如何将一个客户端请求路由到指定服务,该服务运行在你的集群中.这些规则可以考虑到输入的HTT ...