Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能得到;“钥匙”;来自使用groovy保存在我的计算机中的未知.json_Json_Groovy_Soapui - Fatal编程技术网

我怎样才能得到;“钥匙”;来自使用groovy保存在我的计算机中的未知.json

我怎样才能得到;“钥匙”;来自使用groovy保存在我的计算机中的未知.json,json,groovy,soapui,Json,Groovy,Soapui,我的最终目标是通过存储在笔记本电脑上的未知.json文件进行解析,并使用SoapUI中的Groovy获取密钥名(而不仅仅是值和密钥名)。 我想解析存储在我的计算机中的未知JSON文件并获取其密钥(密钥的名称,而不是值)。我可以分别做两件事: 我可以使用在线找到的以下代码读取本地JSON: def JSON_URL = "file:///C:/Users/xxx/example.json" URL url = new URL(JSON_URL) InputStream urlStream

我的最终目标是通过存储在笔记本电脑上的未知.json文件进行解析,并使用SoapUI中的Groovy获取密钥名(而不仅仅是值和密钥名)。

我想解析存储在我的计算机中的未知JSON文件并获取其密钥(密钥的名称,而不是值)。我可以分别做两件事:

  • 我可以使用在线找到的以下代码读取本地JSON:

    def JSON_URL = "file:///C:/Users/xxx/example.json"    
    URL url = new URL(JSON_URL)
    InputStream urlStream = null
    
         try {
          urlStream = url.openStream()
          BufferedReader reader = new BufferedReader(new Inpu   tStreamReader(urlStream))
          JsonSlurper js1 = new JsonSlurper()
          Object result = js1.parse(reader)
          log.info "==> readJSONfile2 result of read: "+result
    } catch (Exception e) {
        log.info e
    }
    
  • 如果我有URL,我可以解析它并获得如下键:

    // getting the response
    
    def resp1 = context.expand('${testStepName#response}')
    
    //解析集合上下文

    def js1 = new JsonSlurper().parseText(resp1)
    
    def keys = js1.entrySet() as List
    
    log.info "==> runTreatmentPlan keys list is: "+keys
    
    log.info "==> runTreatmentPlan keys size is: "+keys.size()
    
  • 但是,如果JSON是我的机器本地的,我就无法获得密钥,也就是说,无法组合这两个代码。我在执行以下操作时出错:

    Object result = js1.parseText(reader) 
    
    我是groovy、SoapUI和json的新手,这是我的第一个问题。我真的很害怕,因为我看到有些人对其他新手有点粗暴,如果问题是基本的。我保证,我做过很多谷歌搜索,我相信有经验的人也会觉得我的问题很愚蠢,但我真的被卡住了。我无法合并这两段代码。我有点觉得我必须如何使用来自#1代码的响应,但我不知道如何使用。 有人能帮我吗

    ==使用JSON结构更新:

    {
    “密钥0”:[
    {
    “键1”:“值1”,
    “键2”:“值2”,
    “键3”:“值3”,
    “关键4”:{
    “subKey1”:“subValue1”
    },
    “键5”:{
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”,
    “subKey3”:“subValue3”,
    “subKey4”:“subValue4”
    },
    “键6”:“2016-07-11T17:52:59.000Z”,
    “键7”:[
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    },
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    },
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    },
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    }
    ]
    },
    {
    “键1”:“值1”,
    “键2”:“值2”,
    “键3”:“值3”,
    “关键4”:{
    “subKey1”:“subValue1”
    },
    “键5”:{
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”,
    “subKey3”:“subValue3”,
    “subKey4”:“subValue4”
    },
    “键6”:“2016-07-11T17:52:59.000Z”,
    “键7”:[
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    },
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    },
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    },
    {
    “subKey1”:“subValue1”,
    “subKey2”:“subValue2”
    }
    ]
    }
    ]
    }
    
    更新:
    在查看了实际的json结构和SOAPUI中Groovy版本的问题之后,下面是一个可行的选项,可以以特定的格式获取所有键:

    import groovy.json.JsonSlurper
    
    def textFromFile = new File('/path/to/example.json').text
    def content = new JsonSlurper().parseText(textFromFile)
    
    def getAllKeys(Map item) {
        item.collect { k, v ->
            v instanceof Map ? convertToString(v).collect { "${k}.$it" } : k
        }.flatten() 
    }
    
    assert getAllKeys(content) == [
     'Key1', 'Key2', 'Key3', 
     'Key4.subKey1', 'Key5.subKey1', 'Key5.subKey2', 
     'Key5.subKey3', 'Key5.subKey4', 
     'Key6', 'Key7'
    ]
    
    更新:
    在查看了实际的json结构和SOAPUI中Groovy版本的问题之后,下面是一个可行的选项,可以以特定的格式获取所有键:

    import groovy.json.JsonSlurper
    
    def textFromFile = new File('/path/to/example.json').text
    def content = new JsonSlurper().parseText(textFromFile)
    
    def getAllKeys(Map item) {
        item.collect { k, v ->
            v instanceof Map ? convertToString(v).collect { "${k}.$it" } : k
        }.flatten() 
    }
    
    assert getAllKeys(content) == [
     'Key1', 'Key2', 'Key3', 
     'Key4.subKey1', 'Key5.subKey1', 'Key5.subKey2', 
     'Key5.subKey3', 'Key5.subKey4', 
     'Key6', 'Key7'
    ]
    

    根据您的输入,此代码:

    import groovy.json.JsonSlurper
    
    def traverse
    traverse = { tree, keys = [], prefix = '' ->
        switch (tree) {
            case Map:
                tree.each { k, v -> 
                    def name = prefix ? "${prefix}.${k}" : k
                    keys << name
                    traverse(v, keys, name)
                }
                return keys
            case Collection:
                tree.eachWithIndex { e, i -> traverse(e, keys, "${prefix}[$i]") }
                return keys
            default :
                return keys
        }
    }
    
    def content = new JsonSlurper().parse( new File( 'sample.json' ) )
    
    traverse(content).each { println it }
    

    根据您的输入,此代码:

    import groovy.json.JsonSlurper
    
    def traverse
    traverse = { tree, keys = [], prefix = '' ->
        switch (tree) {
            case Map:
                tree.each { k, v -> 
                    def name = prefix ? "${prefix}.${k}" : k
                    keys << name
                    traverse(v, keys, name)
                }
                return keys
            case Collection:
                tree.eachWithIndex { e, i -> traverse(e, keys, "${prefix}[$i]") }
                return keys
            default :
                return keys
        }
    }
    
    def content = new JsonSlurper().parse( new File( 'sample.json' ) )
    
    traverse(content).each { println it }
    


    您的用例是什么?看看这是不是你想要的?谢谢你的回复Rao,但这不是我想要的。。。mor elike@dmahapatro说的话……可能取决于你拿到钥匙后想做什么。因为,
    entrySet()
    将只获取即时属性。如果一个属性很复杂,那么必须循环遍历它。也可以有数组,所以将键从层次设置为线性并没有多大用处。这就是为什么我在阅读任意json后问您的用例是什么?@Jigs查看我的更新答案。我相信这就是您所寻找的。@dmahapatro,请参阅下面我的更新……您的用例是什么?看看这是不是你想要的?谢谢你的回复Rao,但这不是我想要的。。。mor elike@dmahapatro说的话……可能取决于你拿到钥匙后想做什么。因为,
    entrySet()
    将只获取即时属性。如果一个属性很复杂,那么必须循环遍历它。也可以有数组,所以将键从层次设置为线性并没有多大用处。这就是为什么我在阅读任意json后问您的用例是什么?@Jigs查看我的更新答案。我相信这就是您想要的。@dmahapatro,请参阅下面我的更新…谢谢dmahapatro,此代码引发错误:groovy.lang.MissingMethodException:没有方法签名:groovy.json.JsonSlurper.parse()适用于参数类型:(java.io.File)值:[C:\Users\example.json]您使用的是哪个版本的Groovy?版本是否低于2.2.0?似乎我拥有的免费SoapUI版本使用的是2.1.7(groovy-all-2.1.7.jar),因为您使用的是SoapUI的免费版本,所以升级到最新版本会更容易。升级到最新版本,在那里可以使用更新更好的groovy API。我有最新的“免费”版本5.2.1,不幸的是,它使用了所有东西的旧版本。我尝试在bin文件夹中将旧的groovyjar2.1.7替换为新的2.3.10n,但是SoapUI挂起了。。。拒绝启动(显然)…谢谢dmahapatro,这段代码抛出错误:groovy.lang.MissingMethodException:没有方法签名:groovy.json.JsonSlurper.parse()适用于参数类型:(java.io.File)值:[C:\Users\example.json]您使用的是哪个版本的groovy?版本是否低于2.2.0?似乎我拥有的免费SoapUI版本使用的是2.1.7(groovy-all-2.1.7.jar),因为您使用的是SoapUI的免费版本,所以升级到最新版本会更容易。升级到最新版本,在那里可以使用更新更好的groovy API。我有最新的“免费”版本5.2.1,不幸的是,它使用了所有东西的旧版本。我三