5

デフォルトのJsonBuilderライブラリを使用してGroovyでJSON値を作成し、オブジェクトのすべてのnull値を除外することは可能ですか? クラスに注釈を付けてnull値を除外することにより、JacksonがJavaで行うことなど。

例は次のとおりです。

{
   "userId": "25",
   "givenName": "John",
   "familyName": null,
   "created": 1360080426303
}

次のように印刷する必要があります。

{
   "userId": "25",
   "givenName": "John",
   "created": 1360080426303
}
4

4 に答える 4

8

Map私の方法はListプロパティを使用して動作するため、問題がないかどうかはわかりません。

def map = [a:"a",b:"b",c:null,d:["a1","b1","c1",null,[d1:"d1",d2:null]]]

def denull(obj) {
  if(obj instanceof Map) {
    obj.collectEntries {k, v ->
      if(v) [(k): denull(v)] else [:]
    }
  } else if(obj instanceof List) {
    obj.collect { denull(it) }.findAll { it != null }
  } else {
    obj
  }
}

println map
println denull(map)

収量:

[a:a, b:b, c:null, d:[a1, b1, c1, null, [d1:d1, d2:null]]]
[a:a, b:b, d:[a1, b1, c1, [d1:d1]]]

値をフィルター処理した後、JSON としてnullレンダリングできます。Map

于 2013-02-07T15:10:13.470 に答える
2

この問題を回避するために Groovy メタクラスを使用しましたが、すべての場合に機能するかどうかはわかりません。

必要な要素を保持するクラスを作成しましたが、null (または空の) 値を持つ可能性のあるオプションの要素を除外しました。

private class User {
    def id
    def username
}

次に、このクラスにデータを追加しました。私のユースケースはかなり複雑だったので、これは私が行ったことの例を示すためだけに単純化されたバージョンです:

User a = new User(id: 1, username: 'john')
User b = new User(id: 2, username: 'bob')
def usersList = [a,b]

usersList.each { u ->
    if (u.id == 1)
        u.metaClass.hobbies = ['fishing','skating']
}
def jsonBuilder = new JsonBuilder([users: usersList])
println jsonBuilder.toPrettyString()

結果:

{
"users": [
    {
        "id": 1,
        "username": "john",
        "hobbies": [
            "fishing",
            "skating"
        ]
    },
    {
        "id": 2,
        "username": "bob"
    }
  ]
}
于 2015-04-02T14:40:12.950 に答える