Java解析多层嵌套JSON数据

745 阅读1分钟

背景

在我们做支付成功回调或其他场景中,通常会碰到返回一长串json的数据,层级也比较多,恰巧我们需要的数据往往是层次比较深的数据。
通常我们处理的方法:

  • 根据返回的json结构,编写对应实体类来返回序列化接受数据(结构复杂比较蛋疼)
  • 直接使用Map接收,逐级获取(但是在get过程中会遇到比较麻烦的类型转换问题)
  • 使用序列化框架提供的对象(JsonNode…)

以上方式都会存在一定的缺陷,针对以上问题,有什么方式可以解决呢?

OGNL+Jackson

什么是OGNL?

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

使用

1.引入依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-core</artifactId>  
    <version>2.15.2</version>
</dependency>
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>  
    <version>2.15.2</version>
</dependency>
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.15.2</version>
</dependency>        
<dependency>  
    <groupId>ognl</groupId>  
    <artifactId>ognl</artifactId>  
    <version>3.4.1</version>
</dependency>

2.封装工具类

public class JsonUtil {
    private final static ObjectMapper objectMapper = new ObjectMapper();

    public static <T> T parse(String jsonData, Class<T> clazz) throws Exception {
        return objectMapper.readValue(jsonData, clazz);
    }

    public static <T> T getValue(Map map, String path, Class<T> clazz) throws Exception {
        OgnlContext context = Ognl.createDefaultContext(map);
        T value = (T) Ognl.getValue(path, context, context.getRoot());
        return value;
    }
}

3.Demo

    public static void main(String[] args) throws Exception {
        String jsonData = "{"a":{"b":{"c":{"d":"我是d"}}}}";
        Map map = JsonUtil.parse(jsonData, Map.class);
	// 获取不到的层级会报错
        String value = JsonUtil.getValue(map, "a.b.c.d", String.class);
        System.out.println(value);
    }