如何迭代从 JsonSlurper.parse(JSONFile) 返回的 Map 对象?

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

我在 Ready!Api 1.9.0 中使用 Groovy 脚本来解码 SOAP 响应中返回的 base64 字符串,并将生成的 JSON 对象存储在一个 json 文件。然后获取生成的文件并使用 JsonSlurper 解析它以获取 Map 对象。

需要迭代这个对象,这样我才能找到一个键并断言它的值。我无法弄清楚为什么找不到钥匙。如果我直接使用 map.get(key) 调用一个键,我会得到一个错误 "No such property"。如果我直接使用 map.get('key') 调用它,它 returns 为空。我也试过 Map.each{k -> log.info("${k}")} 其中 returns 'interface.java.util.Map' 而不是预期的键列表。

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

.. //解析前 json 的样本,而不是完整的 json 虽然:

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

题目说的很清楚了,就回答一下吧。

给定包含内容 {"foo":42,"bar":true} 的文件 x.json,以下代码片段读取文件并打印所有键值对:

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

结果(有趣的花絮:键被重新排序,但应该无关紧要):

bar : true
foo : 42

现在你的问题正文很混乱。所有的开头看起来都无关紧要,所以我不确定上面的代码片段是否有帮助,但我希望它会。

现在关于 interface java.util.Map 的奇怪结果:

Map.each { println it } 产生 interface java.util.Map,这是完全正常的,您在对象 Map.class 上 "iterating",而不是读取 [=37= 得到的地图对象] 文件。

另一种说明方式:

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

结果:

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