我尝试在输入为Gpath表达式的JSON对象中添加和删除键。
输入json
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": {"data" :["GML", "XML"]}
},
"GlossSee": "markup"
}
}
}
}}
输入Gpath表达式列表
["glossary.GlossDiv.GlossList.GlossEntry.Abbrev",
"glossary.GlossDiv.GlossList.GlossEntry.GlossSee"]这是我尝试使用groovy jsonSlurper的代码。
def json = new JsonSlurper().parseText(jsonString)
gpathList.each{gpath->
json.$gpath.remove()
}这不会删除json key对象。
有人能帮上忙吗!
发布于 2018-09-10 23:52:21
这是一个基于您的代码片段的工作示例,并在下面进行了解释。
import groovy.json.JsonSlurper
def jsonString = """
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": {"data" :["GML", "XML"]}
},
"GlossSee": "markup"
}
}
}
}
}"""
def gpathList = ["glossary.GlossDiv.GlossList.GlossEntry.Abbrev", "glossary.GlossDiv.GlossList.GlossEntry.GlossSee"]
def json = new JsonSlurper().parseText(jsonString)
List splitPathAroundLastDot(String gpath) {
int lastDotIndex = gpath.lastIndexOf('.')
String path = gpath[0..lastDotIndex-1]
String token = gpath[lastDotIndex+1..gpath.size()-1]
[path,token]
}
gpathList.each{ gpath ->
String path, token
(path, token) = splitPathAroundLastDot(gpath)
Eval.me( 'json', json , "json.${path}.remove('${token}')")
}
println json当您尝试json.$gpath时,它被解释为json["$gpath"]的映射查找,并返回null,因为该元素不在那里。
即使您使用完整路径,您也可以这样做,您将以一个字符串结束,该字符串没有remove()方法。
println json.glossary.GlossDiv.GlossList.GlossEntry.Abbrev.getClass() 将打印类java.lang.String。所以要做你想做的,你应该在json文档中备份一步,为此,我们用splitPathAroundLastDot方法拆分gpath。
要计算json文档上的gpath,可以使用Eval.me方法,将json的值绑定到json变量,并从映射中删除元素。
https://stackoverflow.com/questions/52243169
复制相似问题