我怎样才能得到;“钥匙”;来自使用groovy保存在我的计算机中的未知.json
我的最终目标是通过存储在笔记本电脑上的未知.json文件进行解析,并使用SoapUI中的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
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
}
// 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()
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,不幸的是,它使用了所有东西的旧版本。我三