背景
在我们做支付成功回调或其他场景中,通常会碰到返回一长串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);
}