从动态gpath输入中添加和删除Json对象

时间:2018-09-09 09:33:12

标签: json groovy

我试图从输入为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键对象。

任何人都可以帮忙!

1 个答案:

答案 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变量,然后从地图中删除该元素。