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

Josson库无expression的JSON数组被错误评估为空数组求助

解决Josson处理JSON时误修改无expression字段数组的问题

我们使用Josson库处理JSON表达式计算,目标是仅对包含expression字段的节点执行计算。但当前代码运行后,无expression字段的数组termsHtrimSolarMotor被错误置为空数组,正确的数组内容丢失。

示例JSON

{
  "data": {
    "A": "717.5",
    "B": {
      "expression": "calc(205+42*A,A:$.selectedPump.stg)"
    },
    "E": {
      "expression": "calc(A+B)"
    },
    "D": "96",
    "D1": "96",
    "MotorWt": "28.5"
  },
  "selectedPump": {
    "termsHtrimSolarMotor": [
      -7.372112927801618,
      8.837084474924652,
      -1.1152401096382207
    ],
    "overallEffEq": "[-0.0013252914566755647, 0.10052143733055335, -0.005975385931287854]",
    "stg":1
  }
}

原Java代码

String json="{\"data\":{\"A\":\"717.5\",\"B\":{\"expression\":\"calc(205+42*A,A:$.selectedPump.stg)\"},\"E\":{\"expression\":\"calc(A+B)\"},\"D\":\"96\",\"D1\":\"96\",\"MotorWt\":\"28.5\"},\"selectedPump\":{\"termsHtrimSolarMotor\":[-7.372112927801618,8.837084474924652,-1.1152401096382207],\"overallEffEq\":\"[-0.0013252914566755647,0.10052143733055335,-0.005975385931287854]\",\"stg\":1}}";
        
Josson josson = Josson.fromJsonString(json);
        
String expression = josson.getString(
        "entries()" +
        ".concat('field('," +
        "        key," +
        "        value.entries()" +
        "             .[value.expression!=null]*" +
        "             .concat('.field(',key,': eval(',key,'.expression))')" +
        "             .join()," +
        "        ')')" +
        ".join('.')");
System.out.println(expression);
        
JsonNode node=josson.getNode(expression);
System.out.println(node.toString());

原执行输出

field(data.field(B: eval(B.expression)).field(E: eval(E.expression))).field(selectedPump.field(termsHtrimSolarMotor: eval(termsHtrimSolarMotor.expression)))

{"data":{"A":"717.5","B":247.0,"E":964.5,"D":"96","D1":"96","MotorWt":"28.5"},"selectedPump":{"termsHtrimSolarMotor":[],"overallEffEq":"[-0.0013252914566755647,0.10052143733055335,-0.005975385931287854]","stg":1}}

问题原因

原过滤条件仅判断value.expression!=null,但当遍历到数组类型的节点(如termsHtrimSolarMotor)时,eval(termsHtrimSolarMotor.expression)会返回null,进而导致该数组被置为空。我们需要先判断节点是对象类型且包含expression字段,再执行计算。

解决方案

修改Josson表达式中的过滤逻辑,增加value.isObject()判断,确保只处理包含expression的对象节点:

修改后的Java代码

String json="{\"data\":{\"A\":\"717.5\",\"B\":{\"expression\":\"calc(205+42*A,A:$.selectedPump.stg)\"},\"E\":{\"expression\":\"calc(A+B)\"},\"D\":\"96\",\"D1\":\"96\",\"MotorWt\":\"28.5\"},\"selectedPump\":{\"termsHtrimSolarMotor\":[-7.372112927801618,8.837084474924652,-1.1152401096382207],\"overallEffEq\":\"[-0.0013252914566755647,0.10052143733055335,-0.005975385931287854]\",\"stg\":1}}";
        
Josson josson = Josson.fromJsonString(json);
        
String expression = josson.getString(
        "entries()" +
        ".concat('field('," +
        "        key," +
        "        value.entries()" +
        "             .[value.isObject() && value.expression!=null]*" +  // 增加对象类型判断
        "             .concat('.field(',key,': eval(',key,'.expression))')" +
        "             .join()," +
        "        ')')" +
        ".join('.')");
System.out.println(expression);
        
JsonNode node=josson.getNode(expression);
System.out.println(node.toString());

执行后正确输出

field(data.field(B: eval(B.expression)).field(E: eval(E.expression))).field(selectedPump)

{"data":{"A":"717.5","B":247.0,"E":964.5,"D":"96","D1":"96","MotorWt":"28.5"},"selectedPump":{"termsHtrimSolarMotor":[-7.372112927801618,8.837084474924652,-1.1152401096382207],"overallEffEq":"[-0.0013252914566755647,0.10052143733055335,-0.005975385931287854]","stg":1}}

可以看到,termsHtrimSolarMotor数组内容被正确保留,仅包含expression的节点B和E被执行了计算。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:07:05