使用Josson库时mergeObjects因字符串含点报错求助
Josson库合并JSON时含点号字符串导致异常的解决方案
问题场景
使用Josson库合并JSON数据时,因字符串"ANSI B16.5 CLASS150 RF"中的点号触发IllegalArgumentException,且无法移除该点号,需解决此异常。
现有JSON数据
{ "tbl05FlangeMasterSuction": { "flangeId": 3836, "flangetype": "RF", "size": 200, "layersOff": "", "specification": "ANSI B16.5 CLASS150 RF", "companionFlangeWt": "2", "maxPressure": 20, "layersOn": "", "uuid": "376E1B0D-1F60-4E8A-968C-D5033E190899" }, "data": { "Check": "ok" } }
出错的Java代码
String a = "{\"tbl05FlangeMasterSuction\":{\"flangeId\":3836,\"flangetype\":\"RF\",\"size\":200,\"layersOff\":\"\",\"specification\":\"ANSIB16.5CLASS150RF\",\"companionFlangeWt\":\"2\",\"maxPressure\":20,\"layersOn\":\"\",\"uuid\":\"376E1B0D-1F60-4E8A-968C-D5033E190899\"},\"data\":{\"Check\":\"ok\"}}"; Josson josson = Josson.fromJsonString(a); String b = "field(data.mergeObjects(?, json('{\"e1\":{\"expression\":\"$.tbl05FlangeMasterSuction.specification.caseValue('ANSI B16.5 CLASS150 RF',100,365)\"}}')))"; JsonNode node = josson.getNode(b.toString());
异常信息
java.lang.IllegalArgumentException: Invalid function call field() : Invalid function call mergeObjects() : Invalid function call json() : Argument is not a valid string literal: '{\"e1\":{\"expression\":\"$.tbl05FlangeMasterSuction.specification.caseValue('ANSI B16 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: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) at com.velotech.pumpselection.velotech.expressionCheck.main(expressionCheck.java:34)
问题分析
异常根源并非字符串中的点号,而是引号嵌套解析错误:
- 代码中
json()函数使用单引号包裹字符串参数,但内部caseValue()的参数也用了单引号,导致解析器提前截断字符串,无法识别完整的JSON内容。
解决方案
调整字符串的引号嵌套与转义规则,确保json()函数的参数能被正确解析:
方案1:修正转义字符
修改String b的定义,对内部单引号进行转义,同时调整外层引号的使用:
String a = "{\"tbl05FlangeMasterSuction\":{\"flangeId\":3836,\"flangetype\":\"RF\",\"size\":200,\"layersOff\":\"\",\"specification\":\"ANSI B16.5 CLASS150 RF\",\"companionFlangeWt\":\"2\",\"maxPressure\":20,\"layersOn\":\"\",\"uuid\":\"376E1B0D-1F60-4E8A-968C-D5033E190899\"},\"data\":{\"Check\":\"ok\"}}"; Josson josson = Josson.fromJsonString(a); // 修正引号转义,确保json函数的参数字符串完整 String b = "field(data.mergeObjects(?, json(\"{\\\"e1\\\":{\\\"expression\\\":\\\"$.tbl05FlangeMasterSuction.specification.caseValue(\\\\'ANSI B16.5 CLASS150 RF\\\\',100,365)\\\"}}\")))"; JsonNode node = josson.getNode(b);
方案2:使用Java文本块(Java 15+)
利用Java文本块简化字符串转义,提升可读性:
String a = "{\"tbl05FlangeMasterSuction\":{\"flangeId\":3836,\"flangetype\":\"RF\",\"size\":200,\"layersOff\":\"\",\"specification\":\"ANSI B16.5 CLASS150 RF\",\"companionFlangeWt\":\"2\",\"maxPressure\":20,\"layersOn\":\"\",\"uuid\":\"376E1B0D-1F60-4E8A-968C-D5033E190899\"},\"data\":{\"Check\":\"ok\"}}"; Josson josson = Josson.fromJsonString(a); // 使用文本块避免繁琐转义 String b = """ field(data.mergeObjects(?, json("{\"e1\":{\"expression\":\"$.tbl05FlangeMasterSuction.specification.caseValue('ANSI B16.5 CLASS150 RF',100,365)\"}}"))) """; JsonNode node = josson.getNode(b);
关键说明
- 字符串中的点号本身不会触发异常,无需移除;
- 核心是保证
json()函数接收的字符串参数格式合法,引号嵌套无冲突; - 若仍有疑问,可检查Josson函数的参数语法规范,确保表达式符合要求。
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

