How do I iterate on a Map object returned from JsonSlurper.parse(JSONFile)?

10,849

The question title is very clear, so let's answer that.

Given file x.json with content {"foo":42,"bar":true}, the following snippet reads the file and prints all key-value pairs:

def map = new groovy.json.JsonSlurper().parse(new File('x.json'))
map.each { key, value ->
  println "$key : $value"
}

Result (interesting tidbit: the keys are reordered, but it should not matter):

bar : true
foo : 42

Now the body of your question is quite confusing. All the beginning looks irrelevant, so I'm not sure the snippet above will help, but I hope it will.

Now about your strange result with interface java.util.Map:

Map.each { println it } yields interface java.util.Map, this is perfectly normal, you are "iterating" on the object Map.class, not your map object resulting from reading the json file.

Another way to illustrate this:

Map.each { println it }
Integer.each { println it }
123.each { println it }
"HI!".each { println it }

Result:

interface java.util.Map
class java.lang.Integer
123
H
I
!
Share:
10,849
justAguy88
Author by

justAguy88

Updated on June 04, 2022

Comments

  • justAguy88
    justAguy88 almost 2 years

    I'm using a Groovy script in Ready!Api 1.9.0 to decode a base64 string which is returned in a SOAP response and store the resulting JSON object in a json file. Then take that resulting file and parse it with JsonSlurper to get a Map object.

    This object needs to be iterated over so I can find a key and assert its value. I am unable to figure out why the keys aren't found. If I directly call a key using map.get(key) I get an error "No such property". If I directly call it using map.get('key') it returns null. I've also tried Map.each{k -> log.info("${k}")} which returns 'interface.java.util.Map' and not the expected list of keys.

    //create file path
    def respFile = "C:\\Users\\me\\Documents\\Temp\\response.json"
    
        //set originaldata in response to var
        def response1 = context.expand( '${Method#Response#declare namespace ns4=\'com/service/path/v4\'; declare namespace ns1=\'com/other/service/path/v4\'; //ns1:RequestResponse[1]/ns1:GetAsset[1]/ns1:Asset[1]/ns4:DR[1]/ns4:Sources[1]/ns4:Source[1]/ns4:OriginalData[1]}' )
    
        //decode the data
        byte[] decoded = response1.decodeBase64()
    
        //create file using file path above if it doesnt exist
        def rf = new File(respFile)
    
        //write data to file NOTE will overwrite existing data
        FileOutputStream f = new FileOutputStream(respFile);
        f.write(decoded);
        f.close();
    
    //begin second file
        import groovy.json.JsonSlurper;
        def inputFile = new File("C:\\Users\\me\\Documents\\Temp\\response.json")
        def parResp = new JsonSlurper().parse(inputFile)
    
        //test to find key
        Map.each{k -> log.info("${k}")}
    

    .. //sample of the json before parse, not the full json though:

    {
     "Response": {
     "ecn": 1000386213,
     "header": {
     "msgRefNum": "bbb-ls-123" 
    },
     "success": true,
     "duplicatedit": false,
     "subjectReturnCode": 1,
     "subject": [
     {
     "uu": 11264448,
     "name": {
     "name3": "WINSTON BABBLE",
     "dob": "19700422",
     "gender": "2",
     "ecCoded": "160824",
     "ecCodeSegment": "ZZ" 
    },
     "acc": [
     {
     "ftp": "01",
     "Number": "AEBPJ3977L",
     "issued": "20010101",
     "mMode": "R" 
    } ],
     "telephone": [
     {
     "telephoneType": "01",
     "telephoneNumber": "9952277966",
     "mMode": "R" 
    } ],
     "address": [
     {
     "line1": "M\/O HEALTH AND FAMILY WELFARE",
     "sCode": "07",
     "cCode": 110009,
     "ac": "04",
     "reportedd": "160430",
     "mMode": "R",
     "mb": "lakjsdf blorb" 
    },