在日常项目开发中,经常遇到与其他数据交互就需要进行数据传输处理,那么当对方系统返回的数据报文有多层复杂的json数据时候,如何简单快捷的获取指定节点的数据呢,答案是可以使用Ognl来解决。
1.什么是ognl?
OGNL全称是Object Graph Navigation Language,翻译为对象导航图语言,是应用在java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能,并且它实现了java.utils.Map 的接口,是一个Map结构的对象。
2.OGNL的三要素
表达式:OGNL表达式是功能强大的表达式语言,在ognl中想要执行取值,赋值,调用方法等等操作,你都需要用表达式表示。通过表达式,底层会解析出来你的想要操作,而且它支持链式结构。
根对象:即root对象,可以理解为OGNL的操作对象,表达式规定做什么,而该对象就指定对谁操作。OGNL叫做对象图导航语言,对象图就是以任意一个对象作为根,通过OGNL可以访问到与这个对象相关的其他对象。底层使用list集合做的。
Context对象:其实就是OGNL的上下文环境。root对象也在OGNL的上下文环境里,底层是一个Map集合。该上下文环境规定了OGNL操作在“哪里进行”,注意访问context对象时候需要在表达式中加上#。
2.如何使用ognl进行多层报文解析获取数据?
1>.项目导入如下依赖:
<dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.4.3</version> </dependency>
2>.如何使用
案例报文
{
"a": {
"b": {
"c": {
"d": "123456"
}
}
},
"h": {
"j": {
"k": {
"l": "121"
}
}
}
}
测试代码
package com.hz;
import com.alibaba.fastjson2.JSON;
import ognl.Ognl;
import ognl.OgnlException;
import java.util.Map;
public class TestOgnl {
public static void main(String[] args) throws OgnlException {
String json = "{\n" +
"\t\"a\": {\n" +
"\t\t\"b\": {\n" +
"\t\t\t\"c\": {\n" +
"\t\t\t\t\"d\": \"123456\"\n" +
"\t\t\t}\n" +
"\t\t}\n" +
"\t},\n" +
"\t\"h\": {\n" +
"\t\t\"j\": {\n" +
"\t\t\t\"k\": {\n" +
"\t\t\t\t\"l\": \"121\"\n" +
"\t\t\t}\n" +
"\t\t}\n" +
"\t}\n" +
"}";
Map<String, Object> ognlContext = JSON.parseObject(json, Map.class);
String path = "a.b.c.d";
Object value1 = Ognl.getValue(path, ognlContext, String.class);
Object value2 = Ognl.getValue("a", ognlContext, String.class);
Object value3 = Ognl.getValue("a.b", ognlContext, String.class);
Object value4 = Ognl.getValue("h.j.k", ognlContext, String.class);
System.out.println(" a.b.c.d 节点 -> "+value1);
System.out.println(" a 节点 -> "+value2);
System.out.println(" a.b 节点 -> "+value3);
System.out.println(" h.j.k 节点 -> "+value4);
}
}