Groovy: конвертировать Json в текст - PullRequest
0 голосов
/ 06 мая 2019

Хотел бы преобразовать приведенную ниже запись json в текст, используя Groovy

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
    }
  }
}  
"""

def data = new JsonSlurper().parseText(js)  

Ожидаемый результат должен быть таким, как показано ниже с правильными именами заголовков:

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

Это всего лишь одна запись json, так как мне преобразовать все записи json с помощью Groovy?

1 Ответ

2 голосов
/ 06 мая 2019

Следующий код:

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    

, где ... обозначает, что блокбез изменений по сравнению с примером выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...