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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:43:06