如何优雅解析多层嵌套的复杂JSON数据

3552 篇文章 111 订阅

我们在平时开发中经常会涉及调用某个REST接口从而获取对应数据的情况,在这个过程中,返回的数据往往都是JSON数据,一般情况下,我们都会针对这些JSON数据定义对应实体类,从而获取我们需要的数据。这种方式对于结构简单的JSON数据是OK的,但是如果遇到下面这种多级嵌套的数据就比较蛋疼了:

 

json

复制代码

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

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

什么是OGNL表达式

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

如何使用

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

 

xml

复制代码

<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>

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

我们封装两个方法:

  • parse:将JSON数据反序列化为Map对象;
  • getValue:使用OGNL表达式从Map中提取数据;
 

java

复制代码

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; } }

测试

 

java

复制代码

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”将取到一个列表,运行代码,我们可得到如下结果:

 
csharp

复制代码

d1 [i1, i2, i3]

小结

我们通过Demo可以看到,使用Ognl表达式可以使我们代码变得更加精炼,避免构造各种复杂实体类的尴尬,关于OGNL的更多用法,小伙伴们可以自行学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值