【问题标题】:groovy jsonbuilder remove json nodegroovy jsonbuilder 删除 json 节点
【发布时间】:2021-11-16 11:33:00
【问题描述】:

我尝试删除包含特定值的 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: 期待 '}' 或 ',' 但得到了当前字符 'o' int 值为 111

当前读取的字符是 'o',int 值应为 111 '}' 或 ',' 但当前字符 'o' 的 int 值为 111 行 编号 1 索引编号 2 [{op:replace, 路径:/server_information/environment,值:QCSGERFX023},{操作:替换, 路径:/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) 在 com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:133) 在 com.kms.katalon.core.main.TestCaseMain$runTestCase$0.call(未知 来源)在 TempTestCase1637062445227.run(TempTestCase1637062445227.groovy:25)

【问题讨论】:

  • 这是 not JSON - 这是一个 .toString() 的 groovy 地图。这很可能不是故意的,并且是上游的问题。找到提供此字符串的位置并将其更改为不序列化(如果它在您的应用程序内)或使用能够完成工作的序列化格式(例如 JSON)
  • 谢谢cfrick,正如你所说,部分问题是由于这个格式不正确的json我替换了这个代码:return diff.toString()这个:return new JsonBuilder( diff ).toPrettyString()

标签: groovy jsonslurper jsonbuilder


【解决方案1】:

感谢 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"
    }
]

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多