首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转置JSON变换

转置JSON变换
EN

Stack Overflow用户
提问于 2021-06-16 20:25:55
回答 1查看 39关注 0票数 0

源JSON:

代码语言:javascript
复制
{
    "kind": "analytics#mcfData",
    "containsSampledData": false,
    "columnHeaders": [
        {
            "name": "mcf:conversionDate",
            "columnType": "DIMENSION",
            "dataType": "STRING"
        },
        {
            "name": "mcf:source",
            "columnType": "DIMENSION",
            "dataType": "STRING"
        },
        {
            "name": "mcf:assistedConversions",
            "columnType": "METRIC",
            "dataType": "INTEGER"
        },
        {
            "name": "mcf:lastInteractionConversions",
            "columnType": "METRIC",
            "dataType": "INTEGER"
        }
    ],
    "totalsForAllResults": {
        "mcf:assistedConversions": "62435",
        "mcf:lastInteractionConversions": "156469"
    },
    "rows": [
        [
            {
                "primitiveValue": "20210501"
            },
            {
                "primitiveValue": "Arena"
            },
            {
                "primitiveValue": "30604"
            },
            {
                "primitiveValue": "75593"
            }
        ],
        [
            {
                "primitiveValue": "20210502"
            },
            {
                "primitiveValue": "Arena"
            },
            {
                "primitiveValue": "31831"
            },
            {
                "primitiveValue": "80876"
            }
        ]
    ]
}

预期:

代码语言:javascript
复制
[
  {
    "report_date": "2021-05-01",
    "metric_name": "mcf:assistedConversions",
    "metric_value": "30604"
  },
  {
    "report_date": "2021-05-01",
    "metric_name": "mcf:lastInteractionConversions",
    "metric_value": "75593"
  },
  {
    "report_date": "2021-05-02",
    "metric_name": "mcf:assistedConversions",
    "metric_value": "31831"
  },
  {
    "report_date": "2021-05-02",
    "metric_name": "mcf:lastInteractionConversions",
    "metric_value": "80876"
  }
]

我需要从源JSON获得的东西:

mcf:conversionDate

  • take数组中的
  1. 循环
  2. 中的元素将这些元素与日期匹配,而columnHeaders忽略元素的columnType = DIMENSION除外,除了columnType = METRIC.的所有元素

rows数组中由columnHeaders排序的元素。

我的尝试:

代码语言:javascript
复制
def slurper = new JsonSlurper()
def json = slurper.parseText('')

def headers = json.columnHeaders

def result = json.rows.collectMany{
            [headers, it].transpose().collect{ h, v ->
                [
                 metric_name: h.name,
                 metric_value: v
                ]
            }
        }

输出:

代码语言:javascript
复制
[
    {
        "metric_name": "mcf:conversionDate",
        "metric_value": {
            "primitiveValue": "20210501"
        }
    },
    {
        "metric_name": "mcf:source",
        "metric_value": {
            "primitiveValue": "Arena"
        }
    },
    {
        "metric_name": "mcf:assistedConversions",
        "metric_value": {
            "primitiveValue": "30604"
        }
    },
    {
        "metric_name": "mcf:lastInteractionConversions",
        "metric_value": {
            "primitiveValue": "75593"
        }
    },
    {
        "metric_name": "mcf:conversionDate",
        "metric_value": {
            "primitiveValue": "20210502"
        }
    },
    {
        "metric_name": "mcf:source",
        "metric_value": {
            "primitiveValue": "Arena"
        }
    },
    {
        "metric_name": "mcf:assistedConversions",
        "metric_value": {
            "primitiveValue": "31831"
        }
    },
    {
        "metric_name": "mcf:lastInteractionConversions",
        "metric_value": {
            "primitiveValue": "80876"
        }
    }
]

如何添加如上所述的report_date?它存储在mcf:conversionDate内部。并去掉metric_value中嵌套的json

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-17 05:52:32

代码语言:javascript
复制
def headers = json.columnHeaders

def result = json.rows.collect{
    /* transform each row to a map like this:
        "mcf:conversionDate": "20210502",
        "mcf:source": "Arena",
        "mcf:assistedConversions": "31831",
        "mcf:lastInteractionConversions": "80876"
    */
    [headers, it].transpose().collectEntries{h,v-> 
        [
            h.name,
            v.primitiveValue
        ]
    }
}.collectMany{map->
    def date = map.remove("mcf:conversionDate") //get date and remove from map
    map.findAll{k,v-> k in ["mcf:assistedConversions","mcf:lastInteractionConversions"] }
        .collect{k,v->
            [
                report_date:  date,
                metric_name:  k,
                metric_value: v,
            ]
        }
}


println (new groovy.json.JsonBuilder(result).toPrettyString())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68009597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档