json中有复杂的嵌套怎么解析?json复杂的嵌套解析方法

进行java开发,我们会使用json进行数据解析,并且json解析的数据易于大家的阅读以及理解,不过在开发中我们肯定会遇到复杂的嵌套的情况,那json中有复杂的嵌套怎么解析?接下来我们就来给大家讲解一下这方面的内容。

json中有复杂的嵌套怎么解析.jpg

代码如下:

{
    "a1":
    {
        "b1":
        {
            "c1":
            {
                "d1": "d1"
            }
        }
    }
    , "a2":
    {
        "b2":
        {
            "c2":
            {
                "d2": ["i1", "i2", "i3"]
            }
        }
    }
}

那么对于这种情况,有没有比较优雅的处理方式呢?

一、什么是OGNL表达式

OGNL全称 “对象图导航语言”,我们可以使用其提供的表达式语言获取JAVA对象树中的任意属性或调用其方法。不仅如此,它还能自动实现必要的类型转换,废话不多说,我们来看看如何使用吧。

二、如何使用

1、首先引入所需的maven依赖,主要包括jackson和ognl:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.11.4</version>
</dependency> <
dependency >
    <groupId>com.fasterxml.jackson.core</groupId> <
    artifactId > jackson - databind < /artifactId> <
    version > 2.11 .4 < /version> <
    /dependency> <
    dependency >
    <groupId>com.fasterxml.jackson.core</groupId> <
    artifactId > jackson - annotations < /artifactId> <
    version > 2.11 .4 < /version> <
    /dependency> <
    dependency >
    <groupId>ognl</groupId> <
    artifactId > ognl < /artifactId> <
    version > 3.1 .26 < /version> <
    /dependency>

2、封装JSON反序列化与数据提取的方法

我们封装两个方法:

parse:将JSON数据反序列化为Map对象

getValue:使用OGNL表达式从Map中提取数据

public class JsonUtils
{
    private static Logger logger = Logger.getLogger("JsonUtils");
    private final static ObjectMapper objectMapper = new ObjectMapper();
    public static ObjectMapper getInstance()
    {
        return objectMapper;
    }
    public static < T > T parse(String jsonStr, Class < T > clazz) throws Exception
    {
        return getInstance()
            .readValue(jsonStr, clazz);
    }
    public static < T > T getValue(Map map, String path, Class < T > klass) throws Exception
    {
        OgnlContext ctx = new OgnlContext();
        ctx.setRoot(map);
        T value = (T) Ognl.getValue(path, ctx, ctx.getRoot());
        return value;
    }
}

3、测试

public class Demo
{
    public static void main(String[] args) throws Exception
    {
        String jsonData = "{\"a1\":{\"b1\":{\"c1\":{\"d1\":\"d1\"}}},\"a2\":{\"b2\":{\"c2\":{\"d2\":[\"i1\",\"i2\",\"i3\"]}}}}";
        Map < String, Object > map = JsonUtils.parse(jsonData, Map.class);
        String s = JsonUtils.getValue(map, "a1.b1.c1.d1", String.class);
        System.out.println(s);
        List < String > list = JsonUtils.getValue(map, "a2.b2.c2.d2", List.class);
        System.out.println(list);
    }
}

我们就以开篇展示的多层JSON数据为例进行演示,其中"a1.b1.c1.d1"将取到值为“d1”的字符串数据,“a2.b2.c2.d2”将取到一个列表,运行代码,我们可得到如下结果:

d1
[i1, i2, i3]

这就是json复杂的嵌套解析方法,其实整体来说也不是很难,我们可以通过Demo看到,使用Ognl表达式可以使我们代码变得更加精炼,避免构造各种复杂实体类的尴尬,最后大家如果想要了解更多json工具教程知识,敬请关注奇Q工具网。

推荐阅读:

springcloud五大组件面试题有哪些?springcloud五大组件面试题

Java关键字怎么导入金山打字通?Java关键字this如何使用?

java有没有内存泄露?java内存泄露是什么?