如何优雅的解析多层JSON报文数据?什么是Ognl?

在日常项目开发中,经常遇到与其他数据交互就需要进行数据传输处理,那么当对方系统返回的数据报文有多层复杂的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>

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.41</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);
    }
}

运行结果

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值