Groovy 从嵌套的 json 数组中收集值

Groovy Collect values from nested json arrays

我正在尝试将嵌套的 json 映射到平面文件中,但在不同数组之间引用时遇到问题。 我让它分别为每个数组工作,但无法弄清楚如何正确引用要包含的父 ID。我尝试使用索引并在定价对象上复制 event.id 和 event.lots.id,但这真的很乱。

也许我只是走错了路,或者对它的工作原理没有正确的想法。

代码

    def body = message.getBody(String.class)
    def jsonSlurper = new JsonSlurper()
    def object = jsonSlurper.parseText(body)
    def i_events = object.events
    def i_lots = object.events.lots
    def i_pricing = object.events.lots.pricings

    def o_values = i_pricing.flatten().collect {"(" + "'" + i_events.collect{it.id}[0] + "'" + "," + "'" + i_lots.collect{it.id}[1] + "'" + "," + "'" + it.id + "'" + ","  + "'" +it.name + "'" + ")" }.join(',')

    
    //just using print for testing
    println o_values

结果

('event_id1','[id A, id B]','p id1','TEST 1'),('event_id1','[id A, id B]','p id2','TEST 2')

预期结果

('event_id1','id3','p id1','TEST 1'),('event_id1','id A','p id2','TEST 2')

示例输入

{
  "events": [
    {
      "id": "event_id1",
      "name": "Test Event 01",
      "to": "2021-08-27T02:30:00.000Z",
      "from": "2021-08-26T16:15:00.000Z",
      "parkingTo": "2021-08-27T02:30:00.000Z",
      "parkingFrom": "2021-08-26T14:15:00.000Z",
      "landmarkId": "111",
      "slug": "test-event1",
      "live": true,
      "lots": [
        {
          "id": "id1",
          "name": "Lot 1",
          "pricings": []
        },
        {
          "id": "id2",
          "name": "Lot 2",
          "pricings": []
        },
        {
          "id": "id3",
          "name": "Lot3",
          "pricings": [
            {
              "id": "p id1",
              "name": "TEST 1"
            }
          ]
        }
      ]
    },
    {
      "id": "event_id2",
      "name": "Test Event 2",
      "to": "2020-08-31T17:00:00.000Z",
      "from": "2020-08-31T14:00:00.000Z",
      "parkingTo": "2020-09-01T08:45:00.000Z",
      "parkingFrom": "2020-08-31T12:45:00.000Z",
      "landmarkId": "111",
      "slug": "test-event2",
      "live": true,
      "lots": [
        {
          "id": "id A",
          "name": "lot A",
          "pricings": [
            {
              "id": "p id2",
              "name": "TEST 2"
            }
          ]
        },
        {
          "id": "id B",
          "name": "lot B",
          "pricings": []
        }
      ]
    }
  ],
  "meta": {
    "total": 2,
    "firstElement": 0,
    "lastElement": 2
  }
}

这样的事情应该可行(很难说,因为您的示例输入似乎与您的预期输出不同)

我添加了一个 quote 方法,如果值包含 ',你需要考虑是否需要这个,以及你将如何逃避事情

def escape(String s) {
    "'${s.replaceAll("'", "\\'")}'"
}

def output = new JsonSlurper().parseText(body).events.collectMany { event ->
    event.lots.collectMany { lot ->
        lot.pricings.collect { pricing ->
            "(${escape(event.id)}, ${escape(lot.id)}, ${escape(pricing.id)}, ${escape(pricing.name)})"
        }
    }
}.join(',')