【问题标题】:Groovy collect from map and submapGroovy 从地图和子地图中收集
【发布时间】:2019-08-18 14:56:13
【问题描述】:

我需要将 JSON 响应转换为 csv 文件。我能够从这里成功使用 Tim Yates 的优秀代码:Groovy code to convert json to CSV file

我现在还需要在 csv 中包含 JSON 的嵌套子图。地图和子地图的关系是1:1。

我无法为收集语句获取正确的语法,该语句将检索已解析的映射和子映射键/值。

示例 JSON

{items=
[
{ 
  created_at=2019-03-27
, entity_id=1
, extension_attributes=[]
},

{
  created_at=2019-03-27
, entity_id=2
, extension_attributes= { employee_id=Emp1, employee_type=CSR}//nested submap
}
]}

时髦

import groovy.json.*

def data = new JsonSlurper().parseText( json ); //"json" is from GET request

def columns = ["created_at","entity_id","employee_id","employee_type"]

def encode = { e -> e ? /"$e"/ : "$e"}

requestFile.append( columns.collect { c -> encode( c ) }.join( ',' ) + '\n');

requestFile.append( data.items.collect { row ->columns.collect { colName -> encode( row[ colName ] ).replaceAll("null","") }.join( ',' )}.join( '\n' ) );//unsure how to use data.items.collect to fetch submap

我想要么 1) 将 JSON 转换如下,以便轻松收集每个键/值:

...
{
  created_at=2019-03-27
, entity_id=2
, employee_id=Emp1
, employee_type=CSR
}
...

或 2) 找出是否有办法使用 Groovy 的 collect 方法将地图/子地图检索为平面地图。

很遗憾,我不是专业的程序员,如有任何帮助,我们将不胜感激!

【问题讨论】:

    标签: json csv groovy nested


    【解决方案1】:

    这是 flatten 闭包,它递归地展平项目:

    def flatten
    flatten = { row ->
        def flattened = [:]
        row.each { k, v ->
            if (v instanceof Map) {
                flattened << flatten(v)
            } else {
                flattened[k] = v
            }
        }
        flattened
    }
    

    您应该在最后一行将row 替换为flatten(row),使其看起来像这样:

    requestFile.append(data.items.collect { row ->
        columns.collect {
            colName -> encode(flatten(row)[colName]).replaceAll("null", "")
        }.join(',')
    }.join('\n'))
    

    结果如下:

    "created_at","entity_id","employee_id","employee_type"
    
    "2019-03-27","1",,
    "2019-03-27","2","Emp1","CSR"
    

    【讨论】:

    • 谢谢德米特里!能够成功测试 flatten 闭合,结果符合预期。
    【解决方案2】:

    还发现以下允许 collect 方法获取嵌套元素:

    def m = data.items.collect{[/"${it?.created_at?:''}"/,/"${it?.extension_attributes?.entity_id?:''}"/,/"${it?.extension_attributes?.employee_id?:''}"/,/"${it?.extension_attributes?.employee_type?:''}"/]}
    
    m.each{requestFile.append(it.join(',')+'\n')}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多