这是一个基于Jexl 和 JSONPath 的表达式解析器
- 解析和执行Jexl表达式
- 解析和执行JSONPath表达式
- 支持变量和函数调用
- 支持隐式类型转换
- 支持字符串替换
- 支持解析 JSON 字符串
- 支持对象字面量
- 支持数组字面量
- 支持映射函数 MAPPING
JexPath 是一个严格模式的表达式引擎,深度结合了 Jexl 的运算能力和 JSONPath 的查询能力,旨在提供安全、可预测的 JSON 数据处理方案。
系统采用经典的分层架构:
- Lexer (词法分析器):
- 负责将输入字符串转换为 Token 流。
- 特殊处理 JSONPath 标记(
$开头),能够识别复杂的嵌套结构(如$.store.book[?(@.price < 10)])。
- Parser (语法解析器):
- 采用递归下降算法(Recursive Descent)构建 AST(抽象语法树)。
- 严格语法校验: 在解析阶段强制执行规范,例如所有属性访问必须显式以
$开头,禁止不明确的隐式访问。
- Semantic Analyzer (语义分析器):
- 对 AST 进行静态语义分析。
- 类型检查: 确保运算符左右两侧的数据类型兼容(例如禁止
数字 - 字符串)。 - 函数验证: 检查内置函数调用的参数数量和参数字面量类型。
- Runtime (运行时):
- 预处理: 扫描并提取表达式中的 JSONPath 查询。
- 数据获取: 使用
jsonpath-plus高效执行查询,支持标准 JSONPath 语法。 - 计算: 将查询结果注入上下文,利用定制的 Jexl 引擎完成最终的逻辑运算和函数调用。
- 严格模式 (Strict Mode):
- 禁用 Jexl 原生的管道符 (
|) 和 Transform 语法,统一使用函数式调用风格。 - 禁止未定义的变量隐式访问,所有数据必须来源于
$根节点。
- 禁用 Jexl 原生的管道符 (
- 增强的 JSONPath 支持:
- 支持过滤器表达式中的当前节点引用 (
@)。 - 支持对
PARSE_JSON等函数返回结果进行链式属性访问(MemberExpression)。
- 支持过滤器表达式中的当前节点引用 (
- 安装依赖
npm install @fett/jexpath- 引入模块
import JexPath from '@fett/jexpath';- 创建实例
const myEngine = new JexPath(data);- 执行表达式
const result = await myEngine.run('$.a + $.b');