Cómo obtener la clave de ArrayList anidada en JSON usando Groovy y cambiar su valor

Necesito poder encontrar la llavequote.orderAttributes[0].attributeDetail.name y establece su valor ennull o cualquier otro valor que quiera. Solo necesito hacer esto para el primer elemento en cualquier lista, por lo que seleccionar [0] está bien. Quiero poder usar una ruta como 'quote.orderAttributes.attributeDetail.name'. Pero dada la cantidad de tiempo que he pasado hasta ahora, por favor avise de mejores enfoques.

Aquí está el Json:

{
  "source": "source",
  "orderId": null,
  "Version": null,
  "quote": {
    "globalTransactionId": "k2o4-6969-1fie-poef",
    "quoteStatus": "Not Uploaded",
    "events": {
      "eventDescription": "event description",
      "eventTypeName": "Event Type"
    },
    "someReport": {
      "acceptResultsFlag": "Y",
      "orderDate": "2017-06-14",
      "orderStatus": "string"
    },
    "anotherReport": {
      "id": 627311,
      "orderDate": "2017-06-14"
    },
    "attributes": [
      {
        "appliedFlag": "Y",
        "attributeDetail": {
          "name": "name1",
          "value": "value1"
        },
        "attributeName": "attribute1"
      },
      {
        "appliedFlag": "N",
        "attributeDetail": {
          "name": "name2",
          "value": "value2"
        },
        "attributeName": "attribute2"
      }
    ],
    "orderAttributes": [
      {
        "appliedFlag": "Y",
        "attributeDetail": {
          "name": "name3",
          "value": "value3"
        },
        "attributeName": "orderAttribute1"
      },
      {
        "appliedFlag": "N",
        "attributeDetail": {
          "name": "name4",
          "value": "value4"
        },
        "attributeName": "orderAttribute2"
      }
    ]
  }
}

Sé que lo siguiente funciona pero requiere que sepa qué objeto (s) es unArrayList y especifique su[0] elemento indexado:

def input = new File("src/test/resources/ShortExample.json")
def json = new JsonSlurper().parse(input)
def option1 = json['quote']["attributes"][0]["attributeDetail"]["name"]
println option1

//or this 
//where csvData.fullPath = quote.orderAttributes.attributeDetail.name

def (tkn1, tkn2, tkn3, tkn4) = csvData.fullPath.tokenize('.')
def option2 = json["$tkn1"]["$tkn2"][0]["$tkn3"]["$tkn4"]
println option2

Me gustaría poder:

def input = new File("src/test/resources/ShortExample.json")
def json = new JsonSlurper().parse(input)
def changeValueTo = null
def (tkn1, tkn2, tkn3, tkn4) = csvData.fullPath.tokenize('.')
json["$tkn1"]["$tkn2"]["$tkn3"]["$tkn4"] = changeValueTo

Traté de implementar muchos de los ejemplos aquí usando recursividad, métodos que crean MapsOrCollections que identifican qué es el objeto y luego lo buscan por clave o valor, incluso ejemplos de trampolín.

Si pudiera señalarme un buen artículo que explicara la serialización y la deserialización, también sería muy apreciado.

Gracias de antemano.

Respuestas a la pregunta(2)

Su respuesta a la pregunta