json - Soapui如何从json响应中提取特定值

标签 json groovy soapui

我正在尝试提取 dsId 的值,但无法做到这一点。

请查看以下详细信息。

我正在使用的 Groovy 脚本是:

import groovy.json.JsonSlurper 
def response = messageExchange.response.responseContent
log.info response

def slurper = new JsonSlurper()
def json = slurper.parseText response
log.info json
log.info json.New England Schools__NE Schools$.dsId

但出现以下错误

enter image description here

我的 json 响应如下。我还想提取 ZIP 的值。

{
  "New England Schools__NE Schools$": {
    "dsId": "ds_608",
    "type": "Account",
    "numericCols": [
      "ZIP",
      "Count Free Lunch",
      "Count Reduced Lunch",
      "Total Lunch Pgm",
      "Total Students",
      "PreKindergarten",
      "Kindergarten",
      "Grade 1",
      "Grade 2",
      "Grade 3",
      "Grade 4",
      "Grade 5",
      "Grade 6",
      "Grade 7",
      "Grade 8",
      "Grade 9",
      "Grade 10",
      "Grade 11",
      "Grade 12"
    ],
    "data": null,
    "AggNumericData": [
      {
        "ZIP": 19949795,
        "Count Free Lunch": 263596,
        "Count Reduced Lunch": 71799,
        "Total Lunch Pgm": 331987,
        "Total Students": 1796594,
        "PreKindergarten": 36553,
        "Kindergarten": 151898,
        "Grade 1": 164370,
        "Grade 2": 169418,
        "Grade 3": 173748,
        "Grade 4": 175505,
        "Grade 5": 179357,
        "Grade 6": 177978,
        "Grade 7": 174655,
        "Grade 8": 170192,
        "Grade 9": 178423,
        "Grade 10": 162045,
        "Grade 11": 147564,
        "Grade 12": 133368
      }
    ],
    "MinMax": [],
    "dsData": "Account Id#%#Territory#%#District#%#Area#%#Region#%#objname#%#~ID~#%#~Lat-Lon Linked~#%#~Latitude~#%#~Longitude~#%#~Lat-Lon Zip~#%#School Name#%#Address#%#City#%#State#%#ZIP#%#ZIP4#%#School Type#%#Status#%#School Level#%#Count Free Lunch#%#Count Reduced Lunch#%#Total Lunch Pgm#%#Total Students#%#PreKindergarten#%#Kindergarten#%#Grade 1#%#Grade 2#%#Grade 3#%#Grade 4#%#Grade 5#%#Grade 6#%#Grade 7#%#Grade 8#%#Grade 9#%#Grade 10#%#Grade 11#%#Grade 12#%#Territory1#%#Region1#%#lat#%#lon#%#terrid\r\n15709#%#Hartford, CT#%#New England#%#Unassigned#%#Unassigned#%#Account#%#15709#%#True#%#41.934711#%#-72.770021#%#06026#%#R. DUDLEY SEYMOUR SCHOOL#%#185 HARTFORD AVENUE#%#EAST GRANBY#%#CT#%#6026#%#9520#%#1#%#1#%#2#%#0#%#0#%#0#%#131#%#0#%#0#%#0#%#0#%#0#%#60#%#71#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#Hartford, CT#%#New England#%#5151204.33051376#%#-8100721.57141633#%#3\r\n15707#%#Hartford, CT#%#New England#%#Unassigned#%#Unassigned#%#Account#%#15707#%#True#%#41.934894#%#-72.730656#%#06026#%#EAST GRANBY HIGH SCHOOL#%#95 SOUTH MAIN STREET#%#EAST GRANBY#%#CT#%#6026#%#9550#%#1#%#1#%#3#%#0#%#0#%#0#%#219#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#57#%#55#%#53#%#54#%#Hartford, CT#%#New England#%#5151231.26605957#%#-8096340.03625871#%#3\r\n15708#%#Hartford, CT#%#New England#%#Unassigned#%#Unassigned#%#Account#%#15708#%#True#%#41.934894#%#-72.730656#%#06026#%#EAST GRANBY MIDDLE SCHOOL#%#95 SOUTH MAIN STREET#%#EAST GRANBY#%#CT#%#6026#%#9550#%#1#%#1#%#2#%#0#%#0#%#0#%#201#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#67#%#73#%#61#%#0#%#0#%#0#%#0#%#Hartford, CT#%#New England#%#5151231.26605957#%#-8096340.03625871#%#3\r\n15706#%#Hartford, CT#%#New England#%#Unassigned#%#Unassigned#%#Account#%#15706#%#True#%#41.944215#%#-72.732696#%#06026#%#ALLGROVE SCHOOL#%#33 TURKEY HILLS ROAD#%#EAST GRANBY#%#CT#%#6026#%#9570#%#1#%#1#%#1#%#0#%#0#%#0#%#275#%#3#%#69#%#65#%#82#%#56#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#Hartford, CT#%#New England#%#5152627.52929053#%#-8096567.12801993#%#3\r\n15710#%#Hartford, CT#%#New England#%#Unassigned#%#Unassigned#%#Account#%#15710#%#True#%#41.944215#%#-72.732696#%#06026#%#HOMEBOUND#%#33 TURKEY HILL ROAD#%#EAST GRANBY#%#CT#%#6026#%#674#%#4#%#3#%#4#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#Hartford, CT#%#New England#%#5152627.52929053#%#-8096567.12801993#%#3\r\n15923#%#Hartford, CT#%#New England#%#Unassigned#%#Unassigned#%#Account#%#15923#%#True#%#42.0027#%#-72.942#%#06027#%#HOMEBOUND#%#30 SOUTH ROAD#%#EAST HARTLAND#%#CT#%#6027#%#9710#%#4#%#3#%#4#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#0#%#Hartford, CT#%#New England#%#5161383.89953631#%#-8119866.29744296#%#3\r\n15922#%#Hartford, CT#%#New England#%#Unassigned#%#Unassigned#%#Account#%#15922#%#True#%#42.0027#%#-72.942#%#06027#%#HARTLAND ELEMENTARY SCHOOL#%#30 SOUTH ROAD#%#EAST HARTLAND#%#CT#%#6027#%#9710#%#1#%#1#%#1#%#0#%#0#%#0#%#2#%#0#%#25#%#17#%#26#%#29#%#37#%#36#%#38#%#35#%#40#%#0#%#0#%#0#%#0#%#Hartford, CT#%#New England#%#5161383.89953631#%#-8119866.29744296#%#3\r\n16335#%#}

在 dsData 中,您可以看到有一些带有值的列名称,如何提取列特定数据?

最佳答案

你犯了一个非常微不足道的错误。

有几件事:

  • 该属性有空格字符:因此需要用引号引起来
  • 还有 $ 需要转义。

这是可以检索 dsId 所需值的语句

将您的最后一条语句更改为:

log.info json.新英格兰学校__NE Schools$.dsId

致:

log.info json."新英格兰学校__NE学校\$".dsId

希望这有帮助。

更新

刚刚注意到您想要提取 ZIP 值,该值恰好是数组 AggNumericData 中第一个元素的属性。早些时候,您帖子中的这个问题不可见或我忽略了。因此在我的答案中更新相同的内容。

以下是获得相同结果的语句:

log.info ​json."新英格兰学校__NE学校\$".AggNumericData[0].ZIP​

更新2:提到的问题的作者,他无法在评论中收集数据。因此,在这里添加如何获得两者。请注意,我必须使用最少的数据来重现它,因为只提供了 json 的一部分。

获取两个请求数据

enter image description here

关于json - Soapui如何从json响应中提取特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37990792/

相关文章:

java - SOAPUI Rest 服务错误

java - 如何使用 Jackson 自动解析 Spring Boot 应用程序中的 JSON

python - 有没有更好的方法将 JSON 转换为 DataFrame?

web-services - SoapUI REST 模拟服务在模拟以根据请求值处理动态响应时给出错误(但相同的方法适用于 SOAP 模拟)

xml - Gradle Groovy如何在XML解析器中保留注释和所有格式

java - 如何更改单个实例的 Java 方法实现?

internet-explorer-8 - soapUI更改(禁用)Internet Explorer的代理设置

json - 用Pig解析 'Complex' JSON

javascript - 一个简单的例子 – Backbone.js 教程 – 基于 JSON + View 的集合

user-interface - Geb 测试经常失败并出现 WaitTimeoutException : condition did not pass in 99. 0 秒