我尝试使用Josson计算json表达式,但它给出了无效函数错误
String json ="{\"data\":{\"B\":\"calc(348+(96*$.SelectedPump.stg*$.ModelMaster.count))\"},\"SelectedPump\":{\"stg\":10,\"ab\":200},\"ModelMaster\":{\"count\":20}}";
Josson josson = Josson.fromJsonString(json.toString());
System.out.println(josson.getNode("data.eval(B)"));
堆栈跟踪:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid function call eval() : Invalid function call calc() : Calc syntax error.
at com.octomix.josson.FuncDispatcher.apply(FuncDispatcher.java:84)
at com.octomix.josson.JossonCore.getPathBySteps(JossonCore.java:328)
at com.octomix.josson.JossonCore.getPathBySteps(JossonCore.java:352)
at com.octomix.josson.JossonCore.getPathBySteps(JossonCore.java:249)
at com.octomix.josson.JossonCore.getPathByExpression(JossonCore.java:211)
at com.octomix.josson.JossonCore.getNodeByExpression(JossonCore.java:147)
at com.octomix.josson.JossonCore.getNodeByExpression(JossonCore.java:142)
at com.octomix.josson.Josson.getNode(Josson.java:279)
2条答案
按热度按时间rjee0c151#
数学公式中的变量不能包含特殊字符。你需要使用替换。变量名可以是任何你想要的,没有特殊字符和
.
。所以,B的语句变成...查询
data.eval(B)
中的函数eval()
作用于节点data
,所以原来的求值语句需要$.
从根节点重新开始取值,对于这个修改版本eval(data.B)
,eval()
作用于根节点,参数为data.B
,所以$.
是不需要的。b1uwtaje2#
Answer by Raymond Choi将是最佳解决方案。
好吧,我已经找到了一个可能的解决方案,这使用乔森模板引擎。
有必要调整JSON字符串以使用占位符来访问不同/嵌套节点的值。我们还必须使用已填充的模板创建新的JSON字符串。此外,遗憾的是,它不会递归地替换占位符。使得必须调用
jossons.fillInPlaceholder()
两次。第一次获取计算公式,第二次替换公式中现有的占位符。输出为:
问题中建议的代码失败了,因为Josson无法解析嵌套/不同的节点值。几乎只要
.
出现在calc()
公式中,语法检查就会失败。但是,可以访问同一级别的节点。因此,如下所示的JSON:可通过以下方式进行评价:
结果相同:
19548.0
.无论哪种方式,都必须调整输入JSON以使用
Josson