5

是否可以使用默认的 JsonBuilder 库在 Groovy 中创建 JSON 值以排除对象的所有空值?例如 Jackson 在 Java 中通过注释类以排除空值。

一个例子是:

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

应打印为:

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

4 回答 4

8

不确定它是否适合您,因为我的方法适用于MapwithList属性:

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]]]

过滤掉null值后,您可以将其呈现Map为 JSON。

于 2013-02-07T15:10:13.470 回答
2

我使用 Groovy 元类来解决这个问题,但不确定它是否适用于所有情况。

我创建了一个 Class 来保存所需的元素,但忽略了可能具有 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 回答
1

如果你不需要使用 JSONBuilder,你可以使用 com.fasterxml.jackson:

制作对象:

private static final ObjectMapper JSON_MAPPER = new ObjectMapper().with {
    setSerializationInclusion(JsonInclude.Include.NON_NULL)
    setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
    setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
    setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE)
}

并显示您的地图列表(地图可以包含任何对象):

println(JSON_MAPPER.writeValueAsString(listOfMaps))
于 2018-01-24T14:03:34.673 回答
1

如果您使用 Groovy >2.5.0,则可以使用JsonGenerator. 下面的示例取自截至 2018 年 7 月的 Groovy 文档

class Person {
    String name
    String title
    int age
    String password
    Date dob
    URL favoriteUrl
}

Person person = new Person(name: 'John', title: null, age: 21, password: 'secret',
                            dob: Date.parse('yyyy-MM-dd', '1984-12-15'),
                            favoriteUrl: new URL('http://groovy-lang.org/'))

def generator = new JsonGenerator.Options()
    .excludeNulls()
    .dateFormat('yyyy@MM')
    .excludeFieldsByName('age', 'password')
    .excludeFieldsByType(URL)
    .build()

assert generator.toJson(person) == '{"dob":"1984@12","name":"John"}'
于 2018-07-06T20:16:21.013 回答