Javascript json响应中的groovy筛选器字段
我试图过滤掉JSON响应中的一些字段。 答复如下:Javascript json响应中的groovy筛选器字段,javascript,json,groovy,Javascript,Json,Groovy,我试图过滤掉JSON响应中的一些字段。 答复如下: { "Status": "Fail", "Code": "500", "Rules": [{ "Status": "Fail", "Message": "Code error", "id": &quo
{
"Status": "Fail",
"Code": "500",
"Rules": [{
"Status": "Fail",
"Message": "Code error",
"id": "123456"
},
{
"Status": "Fail",
"Message": "Configuration error",
"id": "12345"
}
]
}
我想省略代码和id字段,并在JSON中打印其余字段。
最后的回答应该是这样的:-
{
"Status": "Fail",
"Rules": [{
"Status": "Fail",
"Message": "Code error"
},
{
"Status": "Fail",
"Message": "Configuration error"
}
]
}
有什么办法可以实现吗?
var getData={
“状态”:“失败”,
“代码”:“500”,
“规则”:[{
“状态”:“失败”,
“消息”:“代码错误”,
“id”:“123456”
},
{
“状态”:“失败”,
“消息”:“配置错误”,
“id”:“12345”
}
]
};
删除getData.Code;
对于(var i=0;i
const obj={
“状态”:“失败”,
“代码”:“500”,
“规则”:[
{
“状态”:“失败”,
“消息”:“代码错误”,
“id”:“123456”
},
{
“状态”:“失败”,
“消息”:“配置错误”,
“id”:“12345”
}
]
}
const result=Object.keys(obj).reduce((acc,curr)=>{
如果(当前!=“代码”){
acc={
…acc,
[货币]:对象[货币]
}
}
如果(当前==“规则”){
acc={
…acc,
[curr]:对象[curr].map(规则=>{
删除rule.id
返回规则
})
}
}
返回acc
}, {})
console.log(result)
递归遍历json并删除任何深度的特定字段的解决方案:
import groovy.json.*
def str = '''
{
"Status": "Fail",
"Code": "500",
"Rules": [{
"Status": "Fail",
"Message": "Code error",
"id": "123456"
},
{
"Status": "Fail",
"Message": "Configuration error",
"id": "12345"
}
]
}'''
def json = new JsonSlurper().parseText(str)
def clean = recursivelyRemove(json, ['id', 'Code'])
println JsonOutput.prettyPrint(JsonOutput.toJson(clean))
def recursivelyRemove(obj, fieldNames) {
switch(obj) {
case Map:
obj.findAll { k, v ->
!(k in fieldNames)
}.collectEntries { k, v ->
[k, recursivelyRemove(v, fieldNames)]
}
break
case List:
obj.collect { recursivelyRemove(it, fieldNames) }
break
default:
obj
}
}
其中打印:
─➤ groovy solution.groovy 1 ↵
{
"Status": "Fail",
"Rules": [
{
"Status": "Fail",
"Message": "Code error"
},
{
"Status": "Fail",
"Message": "Configuration error"
}
]
}
跑步的时候
这样做的好处是,它不会硬编码到json结构中,也就是说,如果结构因某种原因发生更改,此代码可能仍然可以工作
一个潜在的缺点是,如果您的json结构非常深(比如说数百或数千层嵌套),在我们进行递归调用时,您可能会得到StackOverflowException。这可能取决于您的场景,也可能不取决于您的场景。Groovy已经提供了实现这一点的类和机制,首先您需要导入类Groovy.json.JsonGenerator
然后,您可以定义要从序列化中忽略的字段:
def generator = new JsonGenerator.Options()
.excludeFieldsByName('id', 'Code')
.build()
最后,只需解析输出:
String output = generator.toJson(input)
输出将如下所示:
{
“状态”:“失败”,
“规则”:[
{
“状态”:“失败”,
“消息”:“代码错误”
},
{
“状态”:“失败”,
“消息”:“配置错误”
}
]
}
以下是我如何做到这一点的完整示例:
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import groovy.json.JsonGenerator
String json = '''{
"Status": "Fail",
"Code": "500",
"Rules": [{
"Status": "Fail",
"Message": "Code error",
"id": "123456"
},
{
"Status": "Fail",
"Message": "Configuration error",
"id": "12345"
}
]
}'''
Map input = new JsonSlurper().parseText(json)
def generator = new JsonGenerator.Options()
.excludeFieldsByName('id', 'Code')
.build()
String output = generator.toJson(input)
println JsonOutput.prettyPrint(output)
要查看这个JsonGenerator类的更多配置,您可以访问这里的官方文档:正确,我的数据是非常递归的。此外,当我们在变量中声明静态数据时,这是有效的。我在数据上试过,这是API调用的一个响应,但不起作用。我猜响应数据中存在一些结构性差异。有没有可能把这个示例数据添加到问题中?当我在IDE中测试时,jsonSlurper.parseText打印出来的样子像{Status=Fail,Code=500,Rules=[{},{id=12345}}},但当我在Jenkins阶段打印时一样,它打印出来的是[Status:Fail,Code:500,Rules:[[],{id:12345]]]。知道为什么大括号和=以不同的方式打印吗?可能会猜测这两个调用的响应json不同,但如果没有更多信息,很难说。如果解析失败,这可能表明in数据不是有效的json。这比您想象的更常见。缺少引号,缺少逗号s、 格式不正确的标识符名称等。谢谢,如果我们有深入的递归数据(在我的例子中),这将更加复杂。有没有办法选择某些字段并构造一个新的json,而不是删除这些字段。使用Generator时出现以下错误。启动失败:GroovyUserScript:3:无法解析groovy.j类son.JsonGenerator@第3行第1列。导入groovy.json.JsonGenerator^GroovyUserScript:23:无法解析类JsonGenerator.Options@第23行第17列。def generator=new JsonGenerator.Options()我忘了提到我正在使用groovy 3.0.6作为例子,也许如果你尝试使用该版本,你就不会再看到这个错误。为此,我一直忘记JasonGenerator类,转而使用旧习惯。我认为这应该是公认的答案,只要我们使用groovy的最新版本,只要op只需要过滤输出字符串,而不是groovy映射/列表结构。