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

JSP中使用JSONPath表达式出现')'预期错误的问题咨询

问题原因及规范用法解析

为什么双引号会引发语法错误?

这本质是Java字符串的引号嵌套冲突导致的。在你的JSP脚本片段(<% %>)里,JSONPath表达式是作为Java字符串参数传给JsonPath.read()方法的——Java字符串默认用双引号(")作为边界标记。

当你写"$.student[?(@.id=="543020619-3")].register[*].sname"时,Java解析器会把第一个"当作字符串开头,遇到id==后面的第二个"就认为字符串已经结束了。剩下的543020619-3")].register[*].sname成了无意义的代码片段,自然会抛出')' expected的语法错误——因为解析器期待的是方法参数的结束括号,结果却遇到了混乱的代码。

规范用法有哪些?

针对这种引号嵌套场景,有三种可靠的解决方式:

1. 内部改用单引号包裹匹配值

JSONPath语法本身支持用单引号(')包裹字符串值,直接把表达式里的双引号换成单引号,就能避免和外层Java字符串的双引号冲突:

List<String> result = JsonPath.read(json, "$.student[?(@.id=='543020619-3')].register[*].sname");

2. 转义内部的双引号

如果更习惯用双引号写JSONPath表达式,可以对内部的双引号进行转义(在前面加\),让Java解析器把它识别为字符串内部的普通字符,而非边界:

List<String> result = JsonPath.read(json, "$.student[?(@.id==\"543020619-3\")].register[*].sname");

3. 单独定义表达式变量

把JSONPath表达式单独赋值给一个字符串变量,不仅能避免引号混乱,还能提升代码可读性,后续维护也更方便:

// 先定义表达式
String jsonPath = "$.student[?(@.id=='543020619-3')].register[*].sname";
// 再调用方法
List<String> result = JsonPath.read(json, jsonPath);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:12:20