首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在动态gpath输入中添加和删除Json对象

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

Stack Overflow用户
提问于 2018-09-09 17:33:12
回答 1查看 276关注 0票数 2

我尝试在输入为Gpath表达式的JSON对象中添加和删除键。

输入json

代码语言:javascript
复制
{
"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表达式列表

代码语言:javascript
复制
["glossary.GlossDiv.GlossList.GlossEntry.Abbrev",
"glossary.GlossDiv.GlossList.GlossEntry.GlossSee"]

这是我尝试使用groovy jsonSlurper的代码。

代码语言:javascript
复制
def json = new JsonSlurper().parseText(jsonString)
    gpathList.each{gpath->

        json.$gpath.remove()

    }

这不会删除json key对象。

有人能帮上忙吗!

EN

回答 1

Stack Overflow用户

发布于 2018-09-10 23:52:21

这是一个基于您的代码片段的工作示例,并在下面进行了解释。

代码语言:javascript
复制
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()方法。

代码语言:javascript
复制
println json.glossary.GlossDiv.GlossList.GlossEntry.Abbrev.getClass() 

将打印类java.lang.String。所以要做你想做的,你应该在json文档中备份一步,为此,我们用splitPathAroundLastDot方法拆分gpath。

要计算json文档上的gpath,可以使用Eval.me方法,将json的值绑定到json变量,并从映射中删除元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52243169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档