Следующий код:
import groovy.json.*
def js = """
[
{
"title": {
"titleid": "222",
"titlename": "ABCD",
"titledesc": null
},
"customer": {
"customerDetail": {
"customerid": 878378743,
"customerstatus": "ACTIVE",
"customersystems": {
"customersystem1": "SYS01",
"customersystem2": null
},
"sysid": null
},
"store": {
"storeid": "LOS002",
"storename": "LAStore",
"areacode": "JDHJ8K988"
},
"persons": {
"person1": {
"personid": "123",
"personname": "IIISKDJKJSD"
},
"person2": {
"personid": "456",
"personname": "IUDFIDIKJK"
}
},
"order": {
"orderdetail": {
"orderid": "4291026",
"ordername": "ORD93999"
}
},
"product": {
"orderdate": "20190101",
"currency": "USD",
"amount": 1000.23
}
}
}
]
"""
/*
customerId,customerstatus,customersystem1,sysid,storeid,storename,person1.personid,person1.personname,orderid,orderdate,currency,amount,titlename
878378743,ACTIVE,SYS01,null,LOS002,LAStore,123,IIISKDJKJSD,4291026,20190101,USD,1000.23
*/
def data = new JsonSlurper().parseText(js)
def mappings = [
customerId: { n -> n.customer.customerDetail.customerid },
customerstatus: { n -> n.customer.customerDetail.customerstatus },
customersystem1: { n -> n.customer.customerDetail.customersystems.customersystem1 },
sysid: { n -> n.customer.customerDetail.sysid },
storeid: { n -> n.customer.store.storeid },
storename: { n -> n.customer.store.storename },
'person1.personid': { n -> n.customer.persons.person1.personid },
'person1.personname': { n -> n.customer.persons.person1.personname },
orderid: { n -> n.customer.order.orderdetail.orderid },
orderdate: { n -> n.customer.product.orderdate },
currency: { n -> n.customer.product.currency },
amount: { n -> n.customer.product.amount },
titlename: { n -> n.title.titlename }
]
def headers = mappings.keySet().join(',') //edited thanks to comment
println headers
data.each { item ->
def row = mappings.collect { k, v -> v(item) }.join(',')
println row
}
делает то, что вы просите.Обратите внимание, что я сделал json списком элементов, а не отдельным элементом, так как из вашего текста было видно, что это то, что вы искали.
Запуск приведенного выше кода приводит к:
~> groovy solution.groovy
customerId,customerstatus,customersystem1,sysid,storeid,storename,person1.personid,person1.personname,orderid,orderdate,currency,amount,titlename
878378743,ACTIVE,SYS01,null,LOS002,LAStore,123,IIISKDJKJSD,4291026,20190101,USD,1000.23,ABCD
~>
обратите внимание, что если это относится к какой-то критической системе и не является одноразовым фрагментом кода, вы, вероятно, должны сделатьтакие вещи, как проверка возвращаемого значения v(item)
и запись какой-либо ошибки в противном случае обработки, когда в json нет значения для определенного пути и т. д.
Следует также отметить, что приведенный выше код основан на том факте, чтолитерал карты в groovy (то есть def mappings = [:]
) создает экземпляр LinkedHashMap java, который имеет предсказуемый порядок итераций для таких вещей, как keySet()
и collect { }
.
<< edit >>
Для отдельного элемента json blob вы должны изменить код следующим образом:
def js = """
{
...
}
"""
def item = new JsonSlurper().parseText(js)
def mappings = ...
def headers = mappings.keySet().join(',') //edited thanks to comment
println headers
def row = mappings.collect { k, v -> v(item) }.join(',')
println row
, где ...
обозначает, что блокбез изменений по сравнению с примером выше.