You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Apache JEXL语法中的{}改为Map而非Set、[]改为ArrayList

修改JEXL字面量默认类型:{}为Map、[]为ArrayList

核心逻辑

JEXL的字面量解析行为可通过引擎配置或自定义扩展调整。针对你的需求:

  • 让[]默认生成ArrayList而非原生数组;
  • 让{}默认对应Map(原生JEXL中{key:value}本来就是Map,若要禁用{元素列表}这种Set语法,可额外配置)。

JEXL 3.x 实现(推荐,主流版本)

1. 基础配置

通过JexlFeatures调整解析规则,再构建自定义JexlEngine:

import org.apache.commons.jexl3.*;

public class CustomJexlSetup {
    public static void main(String[] args) {
        // 配置解析特征
        JexlFeatures features = new JexlFeatures()
                // 开启[]字面量解析为List(默认实现是ArrayList)
                .setArrayLiteralAsList(true)
                // 可选:禁用Set字面量语法,强制{}仅作为Map使用
                .setSetLiteral(false);

        // 构建自定义引擎
        JexlEngine jexl = new JexlBuilder()
                .features(features)
                .create();

        // 测试验证
        // []生成ArrayList
        JexlExpression listExpr = jexl.createExpression("[1, 2, 3]");
        System.out.println("[]的实际类型: " + listExpr.evaluate(null).getClass());

        // {}生成Map
        JexlExpression mapExpr = jexl.createExpression("{name: 'Alice', age: 25}");
        System.out.println("{}的实际类型: " + mapExpr.evaluate(null).getClass());
    }
}

2. 自定义Map实现(可选)

如果需要指定Map的具体实现(比如LinkedHashMap),可以自定义JexlUberspect:

import org.apache.commons.jexl3.*;
import java.util.LinkedHashMap;
import java.util.Map;

class CustomMapUberspect extends JexlUberspect {
    @Override
    public Map<String, Object> createMap() {
        // 返回你需要的Map实现类
        return new LinkedHashMap<>();
    }
}

// 构建引擎时替换Uberspect
JexlEngine jexl = new JexlBuilder()
        .features(features)
        .uberspect(new CustomMapUberspect())
        .create();

JEXL 2.x 实现(兼容旧版本)

JEXL 2.x没有JexlFeatures,需要直接重写引擎的集合创建逻辑:

import org.apache.commons.jexl2.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Jexl2CustomSetup {
    public static void main(String[] args) {
        JexlEngine jexl = new JexlEngine() {
            // 把[]生成的数组转为ArrayList
            @Override
            protected Object createArray(Object[] array) {
                ArrayList<Object> list = new ArrayList<>();
                for (Object item : array) {
                    list.add(item);
                }
                return list;
            }

            // 自定义Map实现
            @Override
            protected Map<String, Object> createMap() {
                return new HashMap<>();
            }

            // 禁用Set字面量(可选)
            @Override
            protected java.util.Set<Object> createSet() {
                throw new JexlException("Set字面量已禁用,请使用Map语法");
            }
        };

        // 测试
        Expression listExpr = jexl.createExpression("[1,2,3]");
        System.out.println("[]的实际类型: " + listExpr.evaluate(null).getClass());

        Expression mapExpr = jexl.createExpression("{name: 'Bob'}");
        System.out.println("{}的实际类型: " + mapExpr.evaluate(null).getClass());
    }
}

内容的提问来源于stack exchange,提问作者ishua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:40:25