json - 如何在 JSON 响应中拆分参数的多个值?

标签 json rest groovy soapui web-api-testing

我的 JSON 响应的单个属性有多个值,如下所示。

{
   "version": "10.2.2.48",
   "systemMessages": [   {
      "code": -8010,
      "error": "",
      "type": "error",
      "module": "BROKER"
   }],
   "locations": [   {
      "id": "10101102",
      "name": "Bus Stop",
      "disassembledName": "Bus",
      "coord":       [
         3755258,
         4889121
      ],
      "type": "stop",
      "matchQuality": 1000,
      "isBest": true,
      "modes":       [
         1,
         5,
         11
      ],
      "parent":       {
         "id": "95301001|1",
         "name": "Sydney",
         "type": "locality"
      },
      "assignedStops": [      {
         "id": "10101102",
         "name": "Bus Stop",
         "type": "stop",
         "coord":          [
            3755258,
            4889121
         ],
         "parent":          {
            "name": "Sydney",
            "type": "locality"
         },
         "modes":          [
            1,
            5,
            11
         ],
         "connectingMode": 100
      }]
   }]
}

观察“modes”有 3 个值。如果我尝试通过 JsonSlurper 脚本断言提取模式的值,它给出的值为 [1,5,11] 且计数为 1。我想将它们拆分为 3 个数组元素或变量,并且需要计数为 3。可能的脚本断言代码是什么?

断言:

import groovy.json.JsonSlurper
def resp = messageExchange.response.responseContent;
def jsl = new JsonSlurper().parseText(resp);
def modes = jsl.locations.modes
log.info modes
log.info modes.size()

结果:

Wed Feb 13 10:50:49 AEDT 2019:INFO:[[1, 5, 11]]

Wed Feb 13 10:50:49 AEDT 2019:INFO:1

最佳答案

您在此示例中处理的是 Groovy's spread operator 的简写版本并且您的代码返回有效结果。当您调用 jsl.locations 时,您实际上访问了所有位置对象的列表(示例中的单例列表)。当你打电话时

jsl.locations.modes

您使用的是简写版本

jsl.locations*.modes

这相当于以下代码:

jsl.locations.collect { it.modes }

这段代码的意思是:迭代位置并将位置列表转换为这些位置的模式列表列表 - [[1,5,11]]

应用正确的解决方案取决于更多因素。例如,您需要考虑包含多个位置的 locations 列表 - 在这种情况下,转换 jsl.locations.modes 可能会产生类似 [[1,5 ,11],[1,5,11],[2,4,9]] - 3 个模式列表。

如果您假设始终返回一个位置,那么您可以简单地展平最终列表,例如:

def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11]
assert modes.size() == 3

但是,如果 locations 包含另一个具有完全相同模式的 JSON 对象,那么它将产生完全不同的结果:

def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11,1,5,11]
assert modes.size() == 6

在这种情况下,最好使用如下断言:

def modes = jsl.locations.modes
assert modes == [[1,5,11],[1,5,11]]
assert modes*.size() == [3,3]

这意味着:

  • modes 存储 2 个列表 [1,5,11][1,5,11]
  • 第一个列表的大小为 3,第二个列表的大小也是 3。

关于json - 如何在 JSON 响应中拆分参数的多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660563/

相关文章:

javascript - 如何浏览一个javascript对象

rest - Jersey vs Jersey(独立)vs Jersey with Grizzly vs Jersey with Tomcat - 用于REST服务?

具有 (im)mutable 属性的 Groovy @Immutable 类

grails - 为什么XmlSlurper抛出NumberFormatException?

grails - 优化Mysql批量查询的生成

Java - JSON 解析器错误

javascript - 从 React 调用 API

jquery - 如何将 json 日期格式转换为以下 dd/mm/yyyy

python - 是否只有一个 Python 解释器执行多个并发脚本?

Azure 数据工厂 REST API 返回无效的带分页的 JSON 文件