使用ognl解析复杂嵌套json数据

OGNL

OGNL 是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言。通过简单而一致的语法,OGNL 可以用来存取对象的任意属性,调用对象的方法,遍历对象的整个结构图,实现字段类型转换等功能。在 Java 平台上,OGNL 被广泛用于各种框架中,如 Struts 和 MyBatis,以简化对 Java 对象的操作和访问1234

这种针对复杂的 json 语句

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
 "abc":{
   "c1":[
      "1"
   ]
 },
 "bcd":{
   "abcs":{
      "a":"b"
   }
 }
}

如何使用下面通过 java 来处理

pom 中加入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<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>

下面封装 JsonUtils 来处理

这段代码定义了一个名为JsonUtils的工具类,用于处理 JSON 数据和 OGNL 表达式。下面是对每个部分的详细注释:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class JsonUtils {
    // 使用Logger类记录日志,类名为"JsonUtils"
    private static Logger logger = Logger.getLogger("JsonUtils");

    // 创建一个全局唯一的ObjectMapper实例,用于JSON操作
    private final static ObjectMapper objectMapper = new ObjectMapper();

    // 提供一个公共方法来获取ObjectMapper实例
    public static ObjectMapper getInstance() {
        return objectMapper;
    }

    // 将JSON字符串解析为Java对象。泛型方法允许指定返回对象的类型
    public static <T> T parse(String jsonStr, Class<T> clazz) throws Exception {
        // 使用ObjectMapper的readValue方法将JSON字符串转换为Java对象
        return getInstance().readValue(jsonStr, clazz);
    }

    // 使用OGNL表达式从Map中获取值。泛型方法允许指定返回值的类型
    public static <T> T getValue(Map map, String path, Class<T> klass) throws Exception {
        // 创建一个OGNL上下文对象
        OgnlContext ctx = new OgnlContext();
        // 设置上下文的根对象为传入的Map
        ctx.setRoot(map);
        // 使用OGNL表达式获取Map中指定路径的值
        T value = (T) Ognl.getValue(path, ctx, ctx.getRoot());
        return value;
    }
}

这个类提供了两个静态方法:parse用于将 JSON 字符串转换为 Java 对象,而getValue用于使用 OGNL 表达式从 Map 中提取值。这些方法都是泛型的,允许调用者指定期望的返回类型。此外,类中还定义了一个ObjectMapper实例,它是处理 JSON 数据的核心工具。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up