json - Groovy 从地图和子地图中收集
问题描述
我需要将 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 方法将地图/子地图检索为平面地图。
不幸的是,我不是贸易程序员,任何帮助将不胜感激!
解决方案
这是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"
推荐阅读
- php - 将sql查询转换为laravel eloquent查询
- excel - 从 HTML 获取电子邮件 更快地获取 XMLHTTP
- azure - 如何使用 azure 复制活动加载具有重叠但动态架构列的多个文件?
- amazon-web-services - 将从big rock购买的域名映射到aws ec2服务器
- php - 在配置文件中创建一个 base_url(variable) - Laravel Config
- android - Android C++ NDK:一些共享库拒绝在运行时链接
- python - 使用 Python 逐行比较两个以管道分隔的文件,其中行在另一个文件中不按顺序排列
- selenium - 将黄瓜测试结果保存到服务器中的 Json 文件失败
- javascript - 从另一个数组中提取的数组中获取 id 详细信息
- java - 找不到满足 java 要求的版本(来自版本:)没有为 java 找到匹配的发行版