json 响应中的 Groovy 过滤字段

我正在尝试过滤掉 JSON 响应中的一些字段。响应示例如下:


{

  "Status": "Fail",

  "Code": "500",

  "Rules": [{

      "Status": "Fail",

      "Message": "Code error",

      "id": "123456"

    },

    {

      "Status": "Fail",

      "Message": "Configuration error",

      "id": "12345"

    }

  ]

}

我想省略 code 和 id 字段并以 JSON 格式打印其余字段。最终响应应如下所示:-


{

  "Status": "Fail",

  "Rules": [{

      "Status": "Fail",

      "Message": "Code error"

    },

    {

      "Status": "Fail",

      "Message": "Configuration error"

    }

  ]

}

关于我们如何实现它有什么想法吗?


繁星点点滴滴
浏览 96回答 4
4回答

慕田峪9158850

Groovy 已经提供了类和机制来做到这一点,首先你需要导入类groovy.json.JsonGenerator然后您可以定义要从序列化中忽略的字段:def generator = new JsonGenerator.Options()    .excludeFieldsByName('id', 'Code')    .build()最后只需要解析输出:String output = generator.toJson(input)输出将如下所示:{    "Status": "Fail",    "Rules": [        {            "Status": "Fail",            "Message": "Code error"        },        {            "Status": "Fail",            "Message": "Configuration error"        }    ]}这是我如何做到这一点的完整示例:import groovy.json.JsonSlurperimport groovy.json.JsonOutputimport groovy.json.JsonGeneratorString 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)

Qyouu

递归遍历 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。根据您的情况,这可能会也可能不会。

暮色呼如

var getData = {&nbsp; "Status": "Fail",&nbsp; "Code": "500",&nbsp; "Rules": [{&nbsp; &nbsp; &nbsp; "Status": "Fail",&nbsp; &nbsp; &nbsp; "Message": "Code error",&nbsp; &nbsp; &nbsp; "id": "123456"&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; "Status": "Fail",&nbsp; &nbsp; &nbsp; "Message": "Configuration error",&nbsp; &nbsp; &nbsp; "id": "12345"&nbsp; &nbsp; }&nbsp; ]};delete getData.Code;for (var i = 0; i < getData.Rules.length; i++) {&nbsp; delete getData.Rules[i].id;}console.log(getData);注意:-您可以简单地使用delete elementValue来实现这一点

喵喵时光机

const obj = {&nbsp; &nbsp; "Status": "Fail",&nbsp; &nbsp; "Code": "500",&nbsp; &nbsp; "Rules": [&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Status": "Fail",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Message": "Code error",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "id": "123456"&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Status": "Fail",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Message": "Configuration error",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "id": "12345"&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; ]}const result = Object.keys(obj).reduce((acc, curr) => {&nbsp; if (curr !== "Code") {&nbsp; &nbsp; acc = {&nbsp; &nbsp; &nbsp; ...acc,&nbsp; &nbsp; &nbsp; [curr]: obj[curr]&nbsp; &nbsp; }&nbsp; }&nbsp; if (curr === "Rules") {&nbsp; &nbsp; acc = {&nbsp; &nbsp; &nbsp; ...acc,&nbsp; &nbsp; &nbsp; [curr]: obj[curr].map(rule => {&nbsp; &nbsp; &nbsp; &nbsp; delete rule.id&nbsp; &nbsp; &nbsp; &nbsp; return rule&nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; }&nbsp; }&nbsp; return acc}, {})console.log(result)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript