[英]groovy filter fields in json response
我正在嘗試過濾掉我的 JSON 響應中的一些字段。 下面的示例響應:
{
"Status": "Fail",
"Code": "500",
"Rules": [{
"Status": "Fail",
"Message": "Code error",
"id": "123456"
},
{
"Status": "Fail",
"Message": "Configuration error",
"id": "12345"
}
]
}
我想省略代碼和 id 字段並打印 JSON 中字段的 rest。 最終響應應如下所示:-
{
"Status": "Fail",
"Rules": [{
"Status": "Fail",
"Message": "Code error"
},
{
"Status": "Fail",
"Message": "Configuration error"
}
]
}
關於我們如何實現它的任何想法?
Groovy 已經提供了類和機制來做到這一點,首先你需要導入 class groovy.Z466DEEC76ECDF2345FCA6D38ZJ571F6
然后您可以定義要從序列化中忽略的字段:
def generator = new JsonGenerator.Options()
.excludeFieldsByName('id', 'Code')
.build()
最后只需要解析output:
String output = generator.toJson(input)
output 看起來像這樣:
{
"Status": "Fail",
"Rules": [
{
"Status": "Fail",
"Message": "Code error"
},
{
"Status": "Fail",
"Message": "Configuration error"
}
]
}
這是我如何做到這一點的完整示例:
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 class 的更多配置,您可以 go 到此處的官方文檔: https://groovy-lang.org/json.html#_customizing
var getData = { "Status": "Fail", "Code": "500", "Rules": [{ "Status": "Fail", "Message": "Code error", "id": "123456" }, { "Status": "Fail", "Message": "Configuration error", "id": "12345" } ] }; delete getData.Code; for (var i = 0; i < getData.Rules.length; i++) { delete getData.Rules[i].id; } console.log(getData);
注意:- 您可以簡單地使用delete elementValue
來實現
const obj = { "Status": "Fail", "Code": "500", "Rules": [ { "Status": "Fail", "Message": "Code error", "id": "123456" }, { "Status": "Fail", "Message": "Configuration error", "id": "12345" } ] } const result = Object.keys(obj).reduce((acc, curr) => { if (curr.== "Code") { acc = {..,acc: [curr]. obj[curr] } } if (curr === "Rules") { acc = {..,acc: [curr]. obj[curr].map(rule => { delete rule,id return rule }) } } return 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。 這可能會也可能不會,具體取決於您的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.