json - 使用 JacksonJson 动态忽略属性

标签 json spring jackson

我知道有多种方法可以告诉 JacksonJson 忽略
渲染期间的属性,但它们都是静态的。 (JasonIgnore,MixIn 类,..)。

这是我的场景。域对象可以实现一个名为 FilteredDomain 的接口(interface)来
允许它被动态过滤。接口(interface)简单,只暴露一种方法
“getIgnoreProperties”。 (要忽略的属性列表)。

然后我注册一个绑定(bind)到 FilteredDomain 对象的自定义序列化程序。这
代码看起来像:

private class FilteredDomainSerializer extends JsonSerializer<FilteredDomain> {

    public void serialize(FilteredDomain arg, JsonGenerator jgen,
            SerializerProvider provder) throws IOException,
            JsonProcessingException {

        final BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(arg);

        for (PropertyDescriptor pd : wrapper.getPropertyDescriptors()) {
            final String name = pd.getName();

            if (arg.getIgnoreProperties().containsKey(name))
                continue;

            final Object value = wrapper.getPropertyValue(name);

            jgen.writeObjectField(name, value);
        }
    }
}

首先,我真的不喜欢我需要使用 Spring Bean 包装器来获取所有属性的列表并遍历它们(必须有一种方法可以做到这一点,那就是 jackson json)。

其次,代码仍然不起作用。我得到错误:

org.codehaus.jackson.JsonGenerationException:无法写入字段名称,需要一个值
在 org.codehaus.jackson.impl.JsonGeneratorBase._reportError(JsonGeneratorBase.java:480)
在 org.codehaus.jackson.impl.Utf8Generator.writeFieldName(Utf8Generator.java:270)
在 org.codehaus.jackson.JsonGenerator.writeObjectField(JsonGenerator.java:1088)
在 com.rootmusic.util.SystemJsonObjectMapper$ValueObjectSerializer.serialize(SystemJsonObjectMapper.java:65)
在 com.rootmusic.util.SystemJsonObjectMapper$ValueObjectSerializer.serialize(SystemJsonObjectMapper.java:1)
在 org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:304)
在 org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:254)
在 org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:142)
在 org.codehaus.jackson.map.ser.MapSerializer.serializeFields(MapSerializer.java:287)
在 org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:212)
在 org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:23)
在 org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:606)
在 org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:280)

最佳答案

该错误来自您没有围绕字段名称/值对编写 START_OBJECT/END_OBJECT 的事实,因此应该很容易修复。

至于更动态的过滤,你可以阅读 this blog entry其中包括标准方法。如果您有一组静态定义(您可以在每个序列化的基础上动态选择其中一个),@JsonView 就可以工作,但如果您想要更多动态系统,@JsonFilter 是要走的路。

或者,另一种相对简单的方法是首先将您的 POJO“转换”为 Map:

map Prop = objectMapper.convertValue(pojo, Map.class);

(这类似于将其序列化为 JSON,除了结果是一个将呈现为 JSON 的 Map)

然后有选择地修剪 Map,并将其序列化为 JSON。或者,如果您愿意,可以使用 JsonNode (“树模型”)作为中间事物进行修改然后序列化。

关于json - 使用 JacksonJson 动态忽略属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7038080/

相关文章:

java - Jackson是否支持JsonPath注解

java - jackson :数组中缺少@JsonTypeInfo

ruby-on-rails - 如何在 .to_json 方法上获取自定义属性?

c# - MVC 3 ajax post 没有获取选中值的复选框

json - PowerShell -- 访问 JObject 中的 JArray

java - 如何以编程方式更改 XML 中的值

java - Jackson:了解源 JSON 是数组还是对象

javascript - 如何从 div 调用函数并渲染返回的 json 对象?

java - Spring Boot JMS - 何时应在 @Transacted 方法上发送消息?

java - 将表单数据从 Spring Controller 传递到外部端点