Groovy:如何从json输出中获取特定的值列表

biswetbf  于 2023-06-21  发布在  其他
关注(0)|答案(3)|浏览(287)

我试图从JSON输出中获取一个值列表。

我的代码:

def VALUES_BEFORE = sh """
                   curl -X POST "http://node-01.xyz.com:32010/abc/def" \\
                   -H "accept: application/json" \\
                   -H "Content-Type: application/json" \\
                   -d '{ "cell_ids": [${payload}] }' | json_pp
                  """
def json = readJSON text: VALUES_BEFORE 
                    def mylist = json .value
                 echo "Values are ${mylist}"

输出为JSON以下:

[
   {
      "def" : "bins",
      "value" : 294
   },
   {
      "def" : "valid_bins",
      "value" : 294
   },
   {
      "def" : "covered_bins",
      "value" : 1
   },
   {
      "def" : "sum",
      "value" : 415
   },
   {
      "def" : "histro",
      "value" : "-130.0 -> -120.0: 129 | -120.0 -> -110.0: 82 | -110.0 -> -100.0: 20 | -100.0 -> -90.0: 1 | -90.0 -> -80.0: 0 | -80.0 -> -70.0: 0 | -70.0 -> -60.0: 0 | -60.0 -> -50.0: 0"
   }
]

预期结果:

"value" : "-130.0 -> -120.0: 129 | -120.0 -> -110.0: 82 | -110.0 -> -100.0: 20 | -100.0 -> -90.0: 1 | -90.0 -> -80.0: 0 | -80.0 -> -70.0: 0 | -70.0 -> -60.0: 0 | -60.0 -> -50.0: 0"

你的帮助会很有帮助。谢谢

dnph8jn4

dnph8jn41#

由于JSON和/或Map被重构为具有相同键的Map列表,因此需要遍历整个列表并检查每个元素的map中的键的值:

String myResult
mylist.each() { myMap ->
  if myMap['def'] == 'histro' {
    myResult = myMap['value']
  }
}

以问题所举的例子来说,myResult的值为:

'-130.0 -> -120.0: 129 | -120.0 -> -110.0: 82 | -110.0 -> -100.0: 20 | -100.0 -> -90.0: 1 | -90.0 -> -80.0: 0 | -80.0 -> -70.0: 0 | -70.0 -> -60.0: 0 | -60.0 -> -50.0: 0'

如果数据结构是以def值作为键、以value值作为值的键-值对的单级Map,那么会更简单。如果可能的话,值得考虑相应地改组应对机构。

ilmyapht

ilmyapht2#

这里有一些更简单的方法前面的答案:

变式1

def mylist = json.find { it.def == "histro" }.value

变式2

def mylist2 = json.collect { [(it.def):it.value] }.histro

这会将json输出转换为一个map,其中def为键,value为值。然后直接使用map访问任何条目。

1sbrub3j

1sbrub3j3#

本质上是一个简单的一行程序,使用findResult

import groovy.json.*

def json = new JsonSlurper().parseText '''\
[
   {
      "def" : "bins",
      "value" : 294
   },
   {
      "def" : "valid_bins",
      "value" : 294
   },
   {
      "def" : "covered_bins",
      "value" : 1
   },
   {
      "def" : "sum",
      "value" : 415
   },
   {
      "def" : "histro",
      "value" : "-130.0 -> -120.0: 129 | -120.0 -> -110.0: 82 | -110.0 -> -100.0: 20 | -100.0 -> -90.0: 1 | -90.0 -> -80.0: 0 | -80.0 -> -70.0: 0 | -70.0 -> -60.0: 0 | -60.0 -> -50.0: 0"
   }
]'''

String result = json.findResult{ 'histro' == it.def ? it.value : null }

assert result == '-130.0 -> -120.0: 129 | -120.0 -> -110.0: 82 | -110.0 -> -100.0: 20 | -100.0 -> -90.0: 1 | -90.0 -> -80.0: 0 | -80.0 -> -70.0: 0 | -70.0 -> -60.0: 0 | -60.0 -> -50.0: 0'

相关问题