0

当它包含特定值时,我尝试删除一个 json 节点。但我得到一个错误。目标是通过检查它的路径是否包含前缀和后缀来从我的 json 中删除一个元素

你能帮我让我的代码工作吗?

import groovy.json.JsonSlurper
import groovy.json.JsonBuilder
String pathPrefix = "/server_information/environment"
String pathSuffix = "/server_information/environment"

String diffOfApi = """[{op:replace, path:/server_information/environment, value:QCSGERFX023}, {op:replace, path:/json_detail/pick_batch/0/support_list/0/already_send, value:false}]"""    JsonSlurper slurper = new JsonSlurper()
def slurped = slurper.parseText(diffOfApi)
def parsedJsonDiff = new JsonBuilder(slurped)

println "removeDiffByPath() - avant removeAll parsedJsonDiff : $parsedJsonDiff"
//parsedJsonDiff.removeAll { it.path == "/json_detail/preparation_list/0/consignee/update_date" }
parsedJsonDiff.removeAll { it.path.contains(pathPrefix) && it.path.contains(pathSuffix) }
println "removeDiffByPath() - apres removeAll parsedJsonDiff : $parsedJsonDiff"

println parsedJsonDiff.toString()

目前,我收到此错误:

测试用例/_DEBUG SEB/TEST groovy 失败。原因:groovy.json.JsonException: 期待 '}' 或 ',' 但当前 char 'o' 的 int 值为 111

当前读取的字符是 'o',int 值为 111,期望 '}' 或 ',' 但当前字符 'o' 的 int 值为 111 行号 1 索引号 2 [{op:replace, path:/ server_information/environment, value:QCSGERFX023}, {op:replace, path:/json_detail/pick_batch/0/support_list/0/already_send, value:false}] ..^ at TEST groovy.run(TEST groovy:27) at com .kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194) 在 com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119) 在 com.kms.katalon.core.main .TestCaseExecutor.runScript(TestCaseExecutor.java:430) 在 com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:421) 在 com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java :400) 在 com.kms.katalon.core.main.TestCaseExecutor。accessMainPhase(TestCaseExecutor.java:392) 在 com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:273) 在 com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:142) at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:133) at com.kms.katalon.core.main.TestCaseMain$runTestCase$0.call(Unknown Source) at TempTestCase1637062445227.run(TempTestCase1637062445227.groovy :25)

4

1 回答 1

0

感谢cfrick,我更正了格式错误的diffOfApi json(缺少“”)。然后我使用 jsonSlurper 而不是 jsonBuilder 来使用 removeAll()

这是工作代码:

import groovy.json.JsonSlurper
import groovy.json.JsonBuilder
import groovy.json.JsonParserType

String pathPrefix = "/server_information/environment"
String pathSuffix = "/server_information/environment"
int i=0

//String diffOfApi = """[{op:replace, path:/server_information/environment, value:QCSGERFX023}, {op:replace, path:/json_detail/pick_batch/0/support_list/0/already_send, value:false}]"""
String diffOfApi = """[{"op":"replace", "path":"/server_information/environment", "value":"QCSGERFX023"}, {"op":"replace", "path":"/json_detail/pick_batch/0/support_list/0/already_send", "value":"false"}]"""
JsonSlurper slurper = new JsonSlurper()
//slurper.setType(JsonParserType.LAX)

def slurped = slurper.parseText(diffOfApi)
//def parsedJsonDiff = new JsonBuilder(slurped)

println "removeDiffByPath() - avant removeAll parsedJsonDiff : $slurped"
// on ne tient pas compte des modifs de date de consignee
slurped.each {println "slurped " + ++i + " "+it}
slurped.removeAll { it.path.contains(pathPrefix) && it.path.contains(pathSuffix) }

println "removeDiffByPath() - apres removeAll parsedJsonDiff : $slurped"

def parsedJsonDiff = new JsonBuilder(slurped)

println parsedJsonDiff.toPrettyString()

现在我得到了这个结果:

2021-11-16 15:00:59.997 DEBUG testcase.TEST groovy                     - 12: println(parsedJsonDiff.toPrettyString())
[
    {
        "op": "replace",
        "path": "/json_detail/pick_batch/0/support_list/0/already_send",
        "value": "false"
    }
]
于 2021-11-16T14:05:02.540 回答