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
相关产品推荐
相关产品推荐

