我试图从输入为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键对象。
任何人都可以帮忙!
答案 0 :(得分:0)
这是一个基于您的代码段的工作示例,下面有解释。
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变量,然后从地图中删除该元素。