java - Groovy/Java - JSON - 通过可变路径更新 JSON

标签 java json groovy soapui

有人知道如何在具有可变路径的 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.* 环境中,但如果我必须涉及外部库,那就这样吧。

最佳答案

我对 Eval 的具体实现视而不见。如果我从一开始就阅读文档,我的解决方案实际上很简单。

您可以在此处找到 Eval 的文档:http://docs.groovy-lang.org/2.4.7/html/api/groovy/util/Eval.html

与其尝试为评估的方法/函数赋值,我认为现在这不合逻辑,不如将所有内容集成到评估的表达式中。根据我的发现,您最多可以在 Eval 函数中使用三个变量。

我只需要两个。我需要 jsonbuilder 对象才能获取信息源。我需要获取要设置的值。路径本身可以按其存在的方式使用,因为它已经是评估所需的内容:一个字符串。

代码:

import groovy.json.*

def jsonString = '{"parent":{"child":"oldValue"}}'
def newValue = 'newValue'
def stringPath = 'parent.child'

def json = new JsonSlurper().parseText(jsonString)
def jsonbuilder = new JsonBuilder(json)

Eval.xy(jsonbuilder, newValue, 'x.content.' + stringPath + '= y')

System.out.println(jsonbuilder.toString()=='{"parent":{"child":"newValue"}}')
System.out.println(jsonbuilder.content.parent.child == 'newValue')​​​​​​​

通过使用 Eval.xy(objectOne, objectTwo, StringExpression),我告诉我正在传递一个字符串作为表达式进行评估,其中 x 代表 objectOne,y 代表 objectTwo。

可以在此处的在线 groovy 脚本引擎中查看代码:https://groovyconsole.appspot.com/edit/5202721384693760

小免责声明:我无法想象在代码库中使用计算表达式,让变量被外界随机操纵。如果使用此表达式,它将轻松地位于我的 SoapUI 项目的上下文中。

关于java - Groovy/Java - JSON - 通过可变路径更新 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43739725/

相关文章:

java - Java 解析时 JSON 值中的空格导致 "unexpected token END OF FILE at position 11"异常

java - 为什么我的逆投影矩阵的两个元素始终为 0?

java - 如何使用java中的colt库求解线性方程组

php - 无法从 select2 搜索结果中选择结果

javascript - 无法在 Node.js 应用程序中解析从 Azure 服务总线接收到的 JSON 消息

spring - Grails 服务事务行为

taglib 中的 grails 访问 Controller

grails - 在 Controller 中加载HTML的代码段

java - IntelliJ 看不到模块

java - 如何使用命名空间针对 xsd 验证 xml 文件