Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript json响应中的groovy筛选器字段_Javascript_Json_Groovy - Fatal编程技术网

Javascript json响应中的groovy筛选器字段

Javascript json响应中的groovy筛选器字段,javascript,json,groovy,Javascript,Json,Groovy,我试图过滤掉JSON响应中的一些字段。 答复如下: { "Status": "Fail", "Code": "500", "Rules": [{ "Status": "Fail", "Message": "Code error", "id": &quo

我试图过滤掉JSON响应中的一些字段。 答复如下:

{
  "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映射/列表结构。