aviatorscript icon indicating copy to clipboard operation
aviatorscript copied to clipboard

[语法支持] 自定义函数后,不支持语法糖了吗?

Open airclear opened this issue 8 months ago • 1 comments

com.googlecode.aviator aviator 5.4.3

不支持这种语法吗?response.model_details[0].score

 String ss = "{\"response\":{\"result_msg\":\"业务处理成功\",\"scene_infos\":[{\"decision\":\"accept\",\"scene_code\":\"ANFXFM00173867\"}],\"req_msg_id\":\"88ce66e9669042b494442326cb697fe4\",\"strategy_details\":[],\"success\":true,\"result_code\":\"OK\",\"model_details\":[{\"score\":0.4305107,\"scene_code\":\"ANFXFM00173867\"}],\"security_id\":\"risk_plus_channel|risk_plus_productNode|4527b0ed-e455-4f92-8afd-2fa766706c73\",\"security_result\":\"accept\",\"variable_details\":[]},\"sign\":\"73klOEzx0kYZ4ZFPObDR7KYzfvw=\"}";
        String expr = "response.model_details[0].score";

Object result = AviatorEvaluator.execute(expr, JSON.parseObject(ss);

get error:

while parsing expression: `
response.model_details[0]^^^
`
com.googlecode.aviator.exception.ExpressionSyntaxErrorException: Syntax error: unexpect token ']', maybe forget to insert ';' to complete last expression  at 24, lineNumber: 1, token : [type='Char',lexeme=']',index=24],
while parsing expression: `
response.model_details[0]^^^
`
	at com.googlecode.aviator.AviatorEvaluatorInstance.innerCompile(AviatorEvaluatorInstance.java:1552)
	at com.googlecode.aviator.AviatorEvaluatorInstance.compile(AviatorEvaluatorInstance.java:1515)
	at com.googlecode.aviator.AviatorEvaluatorInstance.compile(AviatorEvaluatorInstance.java:1473)
	at com.googlecode.aviator.AviatorEvaluatorInstance.execute(AviatorEvaluatorInstance.java:1672)
	at com.googlecode.aviator.AviatorEvaluatorInstance.execute(AviatorEvaluatorInstance.java:1689)
	at com.googlecode.aviator.AviatorEvaluatorInstance.execute(AviatorEvaluatorInstance.java:1700)
	at com.googlecode.aviator.AviatorEvaluator.execute(AviatorEvaluator.java:570)

airclear avatar May 12 '25 04:05 airclear

案例 2


public class AviatorExtractUtil {
    private static final Logger LOG = LoggerFactory.getLogger(AviatorExtractUtil.class);

    static {
        // 注册 parseJson 函数
        AviatorEvaluator.addFunction(new ParseJsonFunction());
        //AviatorEvaluator.getInstance().setCachedExpressionByDefault(true);
    }

    /**
     * Aviator 自定义函数:parseJson(str) -> JSONObject
     */
    public static class ParseJsonFunction extends AbstractFunction {
        private static final Logger LOG = LoggerFactory.getLogger(ParseJsonFunction.class);

        @Override
        public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
            String jsonStr = FunctionUtils.getStringValue(arg1, env);
            if (jsonStr == null) {
                LOG.warn("parseJson函数执行失败: 输入字符串为空");
                return AviatorNil.NIL;
            }
            try {
                Map<String, Object> obj = JSON.parseObject(jsonStr);
                LOG.debug("parseJson函数执行成功: input={}, output={}", jsonStr, obj);
                return AviatorRuntimeJavaElementType.valueOf(obj);
            } catch (Exception e) {
                LOG.error("parseJson函数执行异常: input={}, error={}", jsonStr, e.getMessage(), e);
                return AviatorNil.NIL;
            }
        }
        @Override
        public String getName() {
            return "parseJson";
        }
    }

    /**
     * 使用AviatorScript表达式提取值
     */
    public static Object extractWithAviator(Map<String, Object> sourceData, String expr) {
        try {
            if (sourceData == null) {
                LOG.error("Aviator表达式执行失败: 源数据为空, expr={}", expr);
                return null;
            }
            return AviatorEvaluator.execute(expr, sourceData);
        } catch (Exception e) {
            LOG.error("Aviator表达式执行异常: expr={}, sourceData={}, error={}", expr, sourceData, e.getMessage(), e);
            return null;
        }
    }
}

测试 方法

String ss = "{\"Message\":\"OK\",\"RequestId\":\"DD4FAB80-75B0-58DD-BB59FD253A646F80\",\"Data\":{\"extend\":\"{\\\"score6\\\":\\\"39.8657\\\",\\\"score7\\\":\\\"40.8006\\\",\\\"score8\\\":\\\"58.3695\\\",\\\"score9\\\":\\\"49.4486\\\",\\\"score2\\\":\\\"59.8845\\\",\\\"score3\\\":\\\"52.8309\\\",\\\"score4\\\":\\\"43.7565\\\",\\\"score5\\\":\\\"44.4571\\\",\\\"score1\\\":\\\"c\\\"}\"},\"Code\":200}";
        String expr = "parseJson(Data.extend).score1";
        Object result = AviatorExtractUtil.extractWithAviator(JSONObject.parseObject(ss), expr, Object.class);
        System.out.println(result);

报错:

while parsing expression: `
parseJson(Data.extend)^^^
`
com.googlecode.aviator.exception.ExpressionSyntaxErrorException: Syntax error: unexpect token ')', maybe forget to insert ';' to complete last expression  at 21, lineNumber: 1, token : [type='Char',lexeme=')',index=21],
while parsing expression: `
parseJson(Data.extend)^^^
`
	at com.googlecode.aviator.AviatorEvaluatorInstance.innerCompile(AviatorEvaluatorInstance.java:1552)
	at com.googlecode.aviator.AviatorEvaluatorInstance.compile(AviatorEvaluatorInstance.java:1515)
	at com.googlecode.aviator.AviatorEvaluatorInstance.compile(AviatorEvaluatorInstance.java:1473)
	at com.googlecode.aviator.AviatorEvaluatorInstance.execute(AviatorEvaluatorInstance.java:1672)
	at com.googlecode.aviator.AviatorEvaluatorInstance.execute(AviatorEvaluatorInstance.java:1689)
	at com.googlecode.aviator.AviatorEvaluatorInstance.execute(AviatorEvaluatorInstance.java:1700)
	at com.googlecode.aviator.AviatorEvaluator.execute(AviatorEvaluator.java:570)

改成: parseJson(Data.extend)['score1'] 就不报错

airclear avatar May 12 '25 05:05 airclear