【问题标题】:Jenkins Pipeline: How to iterate in JSON object to get information I want?Jenkins Pipeline:如何迭代 JSON 对象以获取我想要的信息?
【发布时间】:2022-01-20 12:48:52
【问题描述】:

我正在尝试使用 AQL 从存储在 Artifactory 中的 docker 图像中获取一些属性。在我的 Jenkins 管道中,我可以访问 aql api,它返回一个 JSON,但我无法遍历响应以获得我需要的内容,即 key.IWant 的值。

这是我在 Jenkinsfile 中使用的 Groovy 代码的一部分。如您所见,我尝试以 2 种不同的方式进行迭代,但都没有奏效。

          // Get the JSON object from the response
          def json = readJSON text: response.content
          println "The follow json obj is ${json}"

          def latestProps = json['results']['properties']
          echo "latestProps ${latestProps}"

          latestPropsRefersTo = ''
          for (def prop in latestProps) {
            echo "Walked through key $prop.key and value $prop.value"
            if(prop.key == 'key.IWant') {
              latestPropsRefersTo = prop.value
              break
            }
          }
          echo "latestPropsRefersTo ${latestPropsRefersTo}"

          def latestPropsRefersTo2 = latestProps.each { key, value ->
            echo "2 - Walked through key $key and value $value"
            if(key == 'key.IWant') {
              return value
            }
          }
          echo "latestPropsRefersTo2 ${latestPropsRefersTo2}"

这是我得到的输出

Success: Status code 200 is in the accepted range: 100:399
[Pipeline] readJSON
[Pipeline] echo
The follow json obj is [results:[[repo:xxx, path:xxx, name:manifest.json, modified:2021-10-18T19:10:25.062-05:00, properties:[[key:key.IWant, value:01], [key:key.IDonWant, value:2021-12-17_23-59-59]]]], range:[start_pos:0, end_pos:1, total:1]]
[Pipeline] echo
latestProps [[[key:key.IWant, value:01], [key:key.IDonWant, value:2021-12-17_23-59-59]]]
[Pipeline] echo
Walked through key [key.IWant, key.IDonWant] and value [01, 2021-12-17_23-59-59]
[Pipeline] echo
latestPropsRefersTo 
[Pipeline] echo
2 - Walked through key [[key:key.IWant, value:01], [key:key.IDonWant, value:2021-12-17_23-59-59]] and value null
[Pipeline] echo
latestPropsRefersTo2 [[[key:key.IWant, value:01], [key:key.IDonWant, value:2021-12-17_23-59-59]]]
[Pipeline] echo

如何正确地将 latestPropsRefersTo(或 latestPropsRefersTo2)设置为值 01? 谢谢!

编辑:我不知道为什么,但我用 prop.key.equals("key.IWant") 替换了 prop.key == 'key.IWant' 并且它起作用了 - 问题是运算符 ==if clause 被评估为false 并且没有设置我需要的属性。

现在一切正常。感谢大家的帮助!

【问题讨论】:

  • 我不知道为什么,但我用prop.key.equals("key.IWant") 替换了prop.key == 'key.IWant',它成功了

标签: json loops groovy jenkins-pipeline


【解决方案1】:

您应该能够使用这些方法来遍历您的 json:

// Get the JSON object from the response
def json = readJSON text: response.content
println "The follow json obj is ${json}"               
json.each { myData ->
    myData.properties.each {myProperties ->
          if(myProperties.key == prop.key) {
             latestPropsRefersTo = myProperties.key
           }
    }

【讨论】:

  • 我不知道为什么,但我用 prop.key.equals("key.IWant") 替换了 prop.key == 'key.IWant' 并且它起作用了 - 问题是操作符 == 的 if 子句被评估为 false 并且属性 I没有设置需要。现在一切正常。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多