How to get key from ArrayList nested in JSON using Groovy and change its value

后端 未结 2 918
长情又很酷
长情又很酷 2021-01-16 10:54

I need to be able to find the key quote.orderAttributes[0].attributeDetail.name and set its value to null or any other value I want. I only need to

相关标签:
2条回答
  • 2021-01-16 11:25

    as variant:

    import groovy.json.*;
    
    def json = '''{
      "source": "source",
      "orderId": null,
      "Version": null,
      "quote": {
        "globalTransactionId": "k2o4-6969-1fie-poef",
        "quoteStatus": "Not Uploaded",
        "attributes": [
          {
            "appliedFlag": "Y",
            "attributeDetail": {
              "name": "name1",
              "value": "value1"
            },
            "attributeName": "attribute1"
          },
          {
            "appliedFlag": "N",
            "attributeDetail": {
              "name": "name2",
              "value": "value2"
            },
            "attributeName": "attribute2"
          }
        ]}
      }'''
    
    json = new JsonSlurper().parseText(json)
    
    def jsonx(Object json, String expr){
        return Eval.me('ROOT',json, expr)
    }
    
    println jsonx(json, 'ROOT.quote.attributes[0].attributeDetail.name')
    jsonx(json, 'ROOT.quote.attributes[0].attributeDetail.name = null')
    println jsonx(json, 'ROOT.quote.attributes[0].attributeDetail.name')
    
    0 讨论(0)
  • 2021-01-16 11:32

    You can access and modify any nested field of JSON object directly, e.g.

    json.quote.attributes[0].attributeDetail.name = null
    

    This is possible, because new JsonSlurper().parse(input) returns a groovy.json.internal.LazyMap object. Groovy allows you to access and modify any Map entries using dot notation, e.g.

    Map<String, Map<String, Integer>> map = [
        lorem: [ipsum: 1, dolor: 2, sit: 3]
    ]
    
    println map.lorem.ipsum // Prints '1'
    map.lorem.ipsum = 10
    println map.lorem.ipsum // Prints '10'
    

    You can apply same approach to your example, e.g.

    import groovy.json.JsonSlurper
    
    String input = '''{
      "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"
          }
        ]
      }
    }'''
    
    def json = new JsonSlurper().parse(input.bytes)
    
    assert json.quote.attributes[0].attributeDetail.name == 'name1'
    
    json.quote.attributes[0].attributeDetail.name = null
    
    assert json.quote.attributes[0].attributeDetail.name == null
    

    I hope it helps.

    0 讨论(0)
提交回复
热议问题