簡體   English   中英

json 響應中的 groovy 過濾字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM