Json Groovy从映射和子映射收集

Json Groovy从映射和子映射收集,json,csv,groovy,nested,Json,Csv,Groovy,Nested,我需要将JSON响应转换为csv文件。我在这里成功地使用了Tim Yates的优秀代码: 我现在还需要在csv中包含JSON的嵌套子映射。地图和子地图之间的关系为1:1 我无法为将检索已解析的map和submap键/值的collect语句获取正确的语法 示例JSON {items= [ { created_at=2019-03-27 , entity_id=1 , extension_attributes=[] }, { created_at=2019-03-27 , entity_

我需要将JSON响应转换为csv文件。我在这里成功地使用了Tim Yates的优秀代码:

我现在还需要在csv中包含JSON的嵌套子映射。地图和子地图之间的关系为1:1

我无法为将检索已解析的map和submap键/值的collect语句获取正确的语法

示例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方法将映射/子映射检索为平面映射


不幸的是,我不是一个程序员的贸易,任何帮助将不胜感激

这里是
展平
闭包,它递归展平一个项目:

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

"created_at","entity_id","employee_id","employee_type"

"2019-03-27","1",,
"2019-03-27","2","Emp1","CSR"

还发现以下允许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')}

谢谢你,德米特里!能够成功测试扁平闭合,结果如预期。
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')}