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