【问题标题】:evaluate JSON expression in child object评估子对象中的 JSON 表达式
【发布时间】:2023-01-12 18:12:30
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • 你可以使用okhttpJSONObjectJSONArray吗?
  • 似乎无法引用位于不同节点/级别的 calc() 中的值。一旦在 calc 函数中包含 .,它就会失败

标签: java json


【解决方案1】:

好吧,我已经使用Jossons 模板引擎找到了一个可能的解决方案。

String json = "{"data":{"B":"calc(348+(96*{{SelectedPump->stg}}*{{ModelMaster->count}}))"},"SelectedPump":{"stg":10,"ab":200},"ModelMaster":{"count":20}}";

Jossons jossons = Jossons.fromJsonString(json);
String output = jossons.fillInPlaceholder("{"s":"{{data->B}}"}");
output = jossons.fillInPlaceholder(output);
System.out.println(output);
System.out.println(Josson.fromJsonString(output).getNode("$.eval(s)"));

有必要调整 JSON 字符串以使用占位符访问来自不同/嵌套节点的值。我们还必须使用填充的模板创建一个新的 JSON 字符串。此外,遗憾的是它不会递归地替换占位符,因此必须调用 jossons.fillInPlaceholder() 两次。第一次获取计算公式,第二次替换公式中现在存在的占位符。

输出是:

output -> {"s":"calc(348+(96*10*20))"}
Josson.fromJsonString(output).getNode("$.eval(s)") -> 19548.0

问题中建议的代码失败,因为 Josson 无法解析嵌套/不同的节点值。几乎只要我们在 calc() 公式中出现 .,语法检查就会失败。但是,可以访问同一级别的节点。所以像这样的 JSON:

{
  "data" : {
    "B" : "calc(348+(96*SelectedPumpStg*ModelMasterCount))",
    "SelectedPumpStg" : 10,
    "ModelMasterCount" : 20
  }
}

可以通过以下方式评估:

String json = "{"data":{"B":"calc(348+(96*SelectedPumpStg*ModelMasterCount))","SelectedPumpStg":10,"ModelMasterCount":20}}";
Josson josson = Josson.fromJsonString(json.toString());
System.out.println(josson.getNode("data.eval(B)"));

结果相同:19548.0

无论哪种方式,都必须调整输入 JSON 以使用 Josson

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多