【发布时间】:2017-05-02 13:53:30
【问题描述】:
有人知道如何在 groovy 中使用可变路径有效地设置 json 吗?
上下文:我正在使用测试工具 soapui。一些测试是数据驱动的候选者。我有很多变数。为了使一些可持续的东西在类似情况下易于实施,我想要一个能够让我设置变量的 Groovy 脚本。
我会将变量命名为“parent.subParent.child”。
我发现了什么:
我确实找到了其他东西,但没有全部记录下来。
我发现的直截了当的事情是评估。通过评估可以获得值,但不能设置它们。
Eval.x(jsonbuilder, 'x.content.' + path) = 'newValue'
将返回错误。但就像我说的,以这种方式检索 json 中的值没有问题。
我尝试了什么: 我有一个适用于一个级别的实现。 我可以说:
jsonbuilder.content.parent.subParent[child] = 'newValue'
这将设置请求实体的值。
然后我尝试将其扩展到未定义的级别。
//Assuming there is a jsonbuilder initialized
def jsonString = "{"parent":{"subParent":{"child":"oldValue"}}}"
def json = new JsonSlurper().parseText(jsonString)
def jsonbuilder = new JsonBuilder(json)
def path = 'parent.subParent.child'
def listPath = path.split("\\.")
def element = jsonbuilder.content
for(int i = 0; i < listPath.size(); i++) {
element = element[listPath[i]]
}
element = 'newValue'
assert jsonbuilder.toString() == "{"parent":{"subParent":{"child":"newValue"}}}"
问题:原始 json 中的值未更新。可能是因为我将 jsonbuilder 变量分配给“元素”并继续使用该实体。
这给我留下了两个问题:
- 如何获取原始json中的元素值?
- 更一般性:如何使用可变路径更新 json?
使用 jsonbuilder 的基本 JSON 分配函数如下所示:jsonbuilder.content.parent.subParent.child = 'newValue' 以下答案之一中给出的不是我想要的。我正在寻找一种使整个事物充满活力的方法。我不想建立一个简单的任务,它已经存在并且运行良好。我正在寻找一台为我完成分配的机器,并将变量名解析为路径。最好在 groovy.json.* 环境中,但如果我必须涉及外部库,那就这样吧。
【问题讨论】: