Tob*_*ias 8 spring json jackson
我知道有多种方法可以告诉JacksonJson在渲染过程中忽略属性但是所有这些都是静态的.(JasonIgnore,MixIn类,..).
这是我的情景.域对象可以实现名为FilteredDomain的接口,以允许动态过滤它.界面很简单,只暴露一个方法"getIgnoreProperties".(要忽略的属性列表).
然后我注册一个绑定到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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我真的不喜欢我需要使用Spring Bean包装器来获取所有属性的列表并遍历它们(必须有一种方法可以做到这一点是jackson json).
其次,代码仍然不起作用.我收到错误:
org.codehaus.jackson.JsonGenerationException:无法在org.codehaus.jackson.impl.Utf8Generator.writeFieldName中写入org.codehaus.jackson.impl.JsonGeneratorBase._reportError(JsonGeneratorBase.java:480)中的字段名称. Utf8Generator.java:270)org.codehaus.jackson.JsonGenerator.writeObjectField(JsonGenerator.java:1088)at com.rootmusic.util.SystemJsonObjectMapper $ ValueObjectSerializer.serialize(SystemJsonObjectMapper.java:65)at com.rootmusic.util.SystemJsonObjectMapper位于org.codehaus.jackson.map.ser.ContainerSerializers的$ ValueObjectSerializer.serialize(SystemJsonObjectMapper.java:1)org.codehaus.jackson.map.ser.ContainerSerializers $ IndexedListSerializer.serializeContents $ IndexedListSerializer.serializeContents(ContainerSerializers.java:309) (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)atg.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:23)atg.codehaus.jackson org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:280)中的.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:606)
该错误来自于您没有围绕字段名称/值对编写START_OBJECT/END_OBJECT,因此应该很容易修复.
至于更动态的过滤,您可以阅读此博客条目,其中包括标准方法.如果您有一组静态定义(其中一个可以基于每个序列化动态选择),则@JsonView可以工作,但如果您想要更多动态系统,@ JsonFilter是可行的方法.
或者,另一种相对简单的方法是首先将您的POJO"转换"为地图:
Map props = objectMapper.convertValue(pojo,Map.class);
(类似于将其序列化为JSON,除了结果是一个将呈现为JSON的Map)
然后有选择地修剪Map,并将其序列化为JSON.或者,如果您愿意,可以使用JsonNode("树模型")作为修改然后序列化的中间事物.
| 归档时间: |
|
| 查看次数: |
7917 次 |
| 最近记录: |