使用groovy脚本解析JSON(使用JsonSlurper)

时间:2017-03-05 00:39:14

标签: json groovy

我只有两天的时间去groovy,我需要用以下结构解析一个json文件。我的实际想法是我需要根据不同的序列在不同的环境中运行一组作业,所以我想出了这种格式的json作为我的groovy的输入文件

{
    "services": [{
        "UI-Service": [{
            "file-location": "/in/my/server/location",
            "script-names": "daily-batch,weekly-batch,bi-weekly-batch",
            "seq1": "daily-batch,weekly-batch",
            "seq2": "daily-batch,weekly-batch,bi-weekly-batch",
            "DEST-ENVT_seq1": ["DEV1", "DEV2", "QA1", "QA2"],
            "DEST-ENVT_seq2": ["DEV3", "DEV4", "QA3", "QA4"]
        }]
    }, {
        "Mobile-Service": [{
            "file-location": "/in/my/server/location",
            "script-names": "daily-batch,weekly-batch,bi-weekly-batch",
            "seq1": "daily-batch,weekly-batch",
            "seq2": "daily-batch,weekly-batch,bi-weekly-batch",
            "DEST-ENVT_seq1": ["DEV1", "DEV2", "QA1", "QA2"],
            "DEST-ENVT_seq2": ["DEV3", "DEV4", "QA3", "QA4"]
        }]
    }]
}

我在下面的脚本中尝试解析json

        def jsonSlurper = new JsonSlurper()
        //def reader = new BufferedReader(new InputStreamReader(new FileInputStream("in/my/location/config.json"),"UTF-8"))
        //def data = jsonSlurper.parse(reader)
        File file = new File("in/my/location/config.json")
        def data = jsonSlurper.parse(file)

        try{
            Map jsonResult = (Map) data;
            Map compService = (Map) jsonResult.get("services");
            String name = (String) compService.get("UI-Service");
            assert name.equals("file-location");

        }catch (E){
            println Exception
        }

我需要首先阅读所有服务(UI服务,移动服务等),然后阅读他们的元素及其价值

2 个答案:

答案 0 :(得分:3)

或者你可以这样做:

new JsonSlurper().parseText(jsonTxt).services*.each { serviceName, elements ->
    println serviceName
    elements*.each { name, value ->
        println "    $name = $value"
    }
}

但这取决于你想要的东西(而你在这个问题上并没有真正解释)

答案 1 :(得分:2)

从JsonParser对象读取的示例:

def data = jsonSlurper.parse(file)
data.services.each{ 
    def serviceName = it.keySet()
    println "**** key:${serviceName}  ******"
    it.each{ k, v ->
        println "element name: ${k}, element value: ${v}"
    }
}

其他选择:

println data.services[0].get("UI-Service")["file-location"]
println data.services[1].get("Mobile-Service").seq1