在 Groovy 中转置 JSON

hsa*_*dik 1 groovy

我有一个 JSON:

{
    "range": "'All traffic",
    "majorDimension": "ROWS",
    "values": [
        [
            "Date",
            "Sessions",
            "Leeds",
            "?ontact_query",
            "wo_?ontact_query"
        ],
        [
            "20200107",
            "3461",
            "15",
            "0",
            "15"
        ],
        [
            "20200115",
            "7824",
            "43",
            "0",
            "43"
        ]
    ]
}

Run Code Online (Sandbox Code Playgroud)

values数组中的元素index[0]是 JSON 属性的名称。我想用以 index[0+] 开头的值映射这些名称。每个索引的值数量可以不同。映射应该是动态的,没有硬索引。

我想获得以下 JSON:

[
  {
    "Date": "20200107",
    "Sessions": "3461",
    "Leeds": "15",
    "Contact_query": "0",
    "wo_Contact_query": "15"
  },
  {
    "Date": "20200115",
    "Sessions": "7824",
    "Leeds": "43",
    "Contact_query": "0",
    "wo_Contact_query": "43"
  }
] 
Run Code Online (Sandbox Code Playgroud)

我用有点奇怪的 JOLT 配置成功地做到了:

[
  {
    "operation": "shift",
    "spec": {
      "values": {
        "0": null,
        "*": {
          "*": "[&1].@(2,[0].[&])"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "0": null,
      "*": "[]"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

但我想用 Groovy 脚本替换它。

我达到了以下解决方案:

def slurped = new JsonSlurper().parseText(text)

def val = slurped.values[0]

def json = slurped.values.collect{
  [val, it].transpose().collectEntries() 
}
Run Code Online (Sandbox Code Playgroud)

但它也会返回[0] element我应该跳过的值:

{
  "Date":"Date",
  "Sessions":"Sessions",
  "Leeds":"Leeds",
  "Contact_query":"Contact_query",
  "wo_Contact_query":"wo_Contact_query"
}
Run Code Online (Sandbox Code Playgroud)

如何改进解决方案?

Jér*_*e B 5

您可以使用pop删除集合的第一个值:

def values = new groovy.json.JsonSlurper().parseText(text).values;
def val = values.pop()
def json = values.collect { [val, it].transpose().collectEntries()  }
Run Code Online (Sandbox Code Playgroud)