aviatorscript
aviatorscript copied to clipboard
[语法支持] 自定义函数后,不支持语法糖了吗?
不支持这种语法吗?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)
案例 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'] 就不报错