2017-05-06 4 views
0

J'utilise un script Groovy dans Ready! Api 1.9.0 pour décoder une chaîne base64 renvoyée dans une réponse SOAP et stocker l'objet JSON résultant dans un fichier json. Ensuite, prenez ce fichier résultant et l'analyser avec JsonSlurper pour obtenir un objet Map.Comment puis-je itérer sur un objet Map retourné à partir de JsonSlurper.parse (JSONFile)?

Cet objet doit être répété pour que je puisse trouver une clé et affirmer sa valeur. Je suis incapable de comprendre pourquoi les clés ne sont pas trouvées. Si j'appelle directement une clé en utilisant map.get (key), j'obtiens une erreur "No such property". Si je l'appelle directement en utilisant map.get ('key'), il retourne null. J'ai également essayé Map.each{k -> log.info("${k}")} qui retourne 'interface.java.util.Map' et non la liste attendue de clés.

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

.. // échantillon du JSON avant Parse, pas le plein JSON si:

{ 
"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" 
}, 
+0

pouvez-vous partager un échantillon de JSON? – Raphael

+0

@Raphael J'ai modifié le message original. – justAguy88

Répondre

1

Le titre de la question est très claire, donc nous allons répondre.

fichier donné x.json avec le contenu {"foo":42,"bar":true}, l'extrait suivant lit le fichier et imprime toutes les paires clé-valeur:

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

Résultat (friandise intéressante: les touches sont réorganisés, mais il ne devrait pas d'importance):

bar : true 
foo : 42 

Maintenant, le corps de votre question est assez confus. Tout le début semble hors de propos, donc je ne suis pas sûr que l'extrait ci-dessus va aider, mais j'espère que ce sera le cas.

Maintenant votre résultat étrange avec interface java.util.Map:

Map.each { println it } cède interface java.util.Map, cela est parfaitement normal, vous « itérez » sur l'objet Map.class, pas votre objet carte résultant de la lecture du fichier JSON.

Une autre façon d'illustrer ceci:

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

Résultat:

interface java.util.Map 
class java.lang.Integer 
123 
H 
I 
! 
+0

Merci beaucoup @Hugues Moreau, qui a entièrement résolu mon problème. Je pensais que c'était une erreur de débutant. – justAguy88