强大的ognl

news/2024/10/5 19:15:11/文章来源:https://www.cnblogs.com/miligu/p/18269373

OGNL

OGNL (Object-Graph Navigation Language),是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。

背景

随着各个系统交互的增加,各式各样复杂层次结构较深的JSON处理逐渐频繁,对JSON解析也变得越来越棘手;在此基础上希望有更好用的JSON解析工具,本次介绍OGNL希望对大家有所帮助。下面通过研究OGNL的原生API来看看如何使用OGNL来进行对象的存取操作。

说明

ONGL使用起来非常简单,且支持很多复杂操作(lambda表达式,map等操作),但通常我们不用担心那些复杂操作,在源码中,我们主要关注如下三个参数

参数名称

说明

tree(Expression)

 

表达式是整个 OGNL 的核心内容,所有的 OGNL 操作都是针对表达式解析后进行的。通过表达式来告诉 OGNL 操作到底要干些什么。OGNL支持大量的表达式,如 “链式访问对象”、表达式计算、甚至还支持 Lambda 表达式。

context

上下文对象,所有OGNL表达式都在当前对象的上下文中进行计算

root

需要操作的对象

/*** Evaluates the given OGNL expression tree to extract a value from the given root object. The* default context is set for the given context and root via <CODE>addDefaultContext()</CODE>.** @param tree       the OGNL expression tree to evaluate, as returned by parseExpression()* @param context    the naming context for the evaluation* @param root       the root object for the OGNL expression* @param resultType the converted type of the resultant object, using the context's type converter* @return the result of evaluating the expression* @throws MethodFailedException            if the expression called a method which failed* @throws NoSuchPropertyException          if the expression referred to a nonexistent property* @throws InappropriateExpressionException if the expression can't be used in this context* @throws OgnlException                    if there is a pathological environmental problem*/
public static Object getValue(Object tree, OgnlContext context, Object root, Class<?> resultType) throws OgnlException {...
}

快速开始

本节仅说明读取JSON字段,读取、注入、修改等操作仍希望使用JavaAPI操作

<dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.4.2</version>
</dependency>

我们以下面这个JSON为例

{"id": "2951asd12ca","platformUid": "paidaxin","nickName": "一只派大星","groupEntity": [{"id": "gid1","name": "第一个群","tagList": [{"id": "tag1","tagName": "tagName1"},{"id": "tag2","tagName": "tagName2"}]},{"id": "gid2","name": "第二个群","tagList": [{"id": "tag1","tagName": "tagName1"}]}]
}
//省略数据拼装,JSON已被反序列化为ProfileEntity 
ProfileEntity profileEntity = initProfile();//如果获取本身属性可以直接this.属性,如果获取的属性为一个List则使用this.{属性}
Ognl.getValue("#this.nickName", profileEntity);
Ognl.getValue("#this.{groupEntity}", profileEntity);
Ognl.getValue("#this.{groupEntity.{tagList}}", profileEntity);
//相比较于Stream.map().flatmap().map()...更为方便

除了获取JSON中的字段外还有什么功能呢?

OGNL - Apache Commons OGNL - Language Guide

 

OGNL | Arthas


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/731658.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ENVI深度学习在虚拟机中使用TeslaT4显卡解决办法

ENVI深度学习在普通物理机中使用Tesla T4等显卡直接安装对应显卡驱动即可,显卡驱动下载地址:https://www.nvidia.cn/Download/Find.aspx?lang=cn 在虚拟机中使用Tesla T4显卡需检查如下两步: 1. 检查虚拟机对应的实体机显卡驱动 保证虚拟机对应的实体机显卡驱动为vGPU显卡…

商城客服系统,对接购买的商城订单,以及商城商品等可以给客户推荐商品

演示网站:gofly.v1kf.com Iframe对接页面使用 您配置的对接页面将会在客服后台对话界面侧边栏中的选项卡里展现出来 您可以基于不同业务逻辑获取相对应的参数来在侧边栏展示自己所需的定制页面 设置对接页面标题和URL添加嵌入的页面标题和地址 【设置】【IFRAME接入(页面标题…

ENVI深度学习V1.2操作教程

软件试用:https://www.cnblogs.com/enviidl/p/16275745.html 计算机环境要求:https://www.cnblogs.com/enviidl/p/16309506.html 教程下载链接:https://pan.baidu.com/s/1uVBtH9u8iJqNTepW4HzP3Q?pwd=envi 提取码:envi 目录 ENVI深度学习V1.2 操作教程 1 ENVI深度学习简介…

ENVI深度学习1.2版本对象检测教程——以寻找特殊路面标志为例

遥感中深度学习的一个常见用途是对象检测(目标识别)。也就是说,识别特定对象,例如车辆和人造结构。对象检测将特征定位在对象级别,而不是像素级别。对象是具有相似空间、光谱和纹理特征的像素组。相比之下,像素分割是逐个像素地定位特征。对象检测不仅提供特征的位置,还…

万字解析 Go 官方结构体化日志包 slog

万字解析 Go 官方结构体化日志包 slog GoCN 2024-06-26 14:25 浙江 听全文以下文章来源于Go编程世界 ,作者江湖十年Go编程世界. 不限于 Golang、Docker、Kubernetes,技术博客 https://jianghushinian.cn/ 的移动版。slog 日志包是 Go 语言中的一个结构化日志库,旨在提供一个…

jupyter -- 创建虚拟环境,安装插件nebextensions(附因jupyter-server版本问题导致403错误的解决方法)

1.首先,打开“anaconda Prompt”命令窗口,创建虚拟环境(myenv),在命令行输入> conda create --name myenv python=3.11.1 (备注:这里的python版本号用本机安装的版本号,可用“python --version”查询) 2.进入虚拟环境,在命令行输入> conda activate myenv 3.安装…

Android Perfetto 系列 3:熟悉 Perfetto View

1. Perfetto View 界面 抓到 Perfetto Trace 之后,一般是在 ui.perfetto.dev 中打开(如果用官方提供的脚本,则会在抓去结束后自动在这个网站上打开,想看看怎么实现的话可以去看看脚本的源码)。打开后界面如下:  可以通过 Open trace file 或者直接把 Perfetto Trac…

Unity3d ECS 动态创建系统

由于需要对System做热更,所以System不能随主程序打包,使用的hybridclr插件编译后需要使用程序集加载的方式进行Dll注入 要执行该操作则需要在代码中进行System的管理 使用的ECS版本 跟随教程 设置不让自动初始化的宏 在自己的脚本中var world = DefaultWorldInitialization.I…

大型国民老牌药品医疗企业如何借助实时数仓冲破数据孤岛桎梏,拥抱数据驱动的经营管理模式

本文将以某国民老牌药企的数据集成实践为案例,详解如何借助实时数仓打破数据孤岛,实现数据驱动、消费者导向的经营管理模式。为企业提供优化数据管理和业务决策的参考。使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量代替 OGG、DSG 等同步工具,「CDC …

MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解

详细介绍如何使用在MoneyPrinterPlus中配置使用微软云语音服务,实现AI自动短视频生成。MoneyPrinterPlus可以使用大模型自动生成短视频,我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能。 Azure的语音服务应该是我用过的效果最好的服务了,微软还得是微软。 …

Camera基础知识

1. 摄像头组成 摄像头通常由以下几个主要组成部分构成:镜头(lens)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。决定一个摄像头好坏的重要部件是:镜头(lens)、图像处理芯片 (DSP)、传感器(sensor) 2. 摄像头采样与格式 YUV 是一种颜色编码方法,和它等同的还…

Linux OpenGrok搭建

OpenGrok是一个源码搜索及交叉引用查询引擎,OpenGrok的引入可以帮助我们更好地在浩如烟海的源码里找到自己需要的那坨代码。目录一、目的二、环境三、相关概念3.1 OpenGrok3.2 CTags3.3 Tomcat四、OpenGrok搭建4.1 安装jdk4.2 安装ctags依赖4.3 安装universal-ctags4.3.1 下载…