Groovy собирать с карты и подкарты - PullRequest
1 голос
/ 28 марта 2019

У меня было требование преобразовать ответ JSON в файл csv.Я смог успешно использовать отличный код Тима Йейтса отсюда: Groovy-код для преобразования json в CSV-файл

Теперь мне нужно включить вложенную подкарту JSON в csv.Соотношение между картой и вложенной картой составляет 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
}
]}

Groovy

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 для извлечения карты / подкарты в виде плоской карты.

К сожалению, я не программист по профессии, и любая помощь будет признательна!

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Вот закрытие 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"
0 голосов
/ 04 апреля 2019

Также обнаружено, что следующий метод позволяет методу сбора извлекать вложенные элементы:

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')}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...