我怎么能告诉jackson忽略一个属性,我无法控制源代码?

长话短说,我的一个实体有一个GeometryCollection ,当你调用“getBoundary”(这是为什么这是另一本书,现在让我们说这是它的工作方式)抛出一个exception。

有没有办法告诉jackson不要包括那个特定的吸气者? 我知道当我拥有/控制代码时,我可以使用@JacksonIgnore。 但是这并不是这样,jackson通过父对象的连续序列化来达到这一点。 我在jackson文档中看到了一个过滤选项。 这是一个合理的解决scheme吗?

谢谢!

你可以使用Jackson Mixins 。 例如:

class YourClass { public int ignoreThis() { return 0; } } 

用这个Mixin

 abstract class MixIn { @JsonIgnore abstract int ignoreThis(); // we don't need it! } 

有了这个:

 objectMapper.getSerializationConfig().addMixInAnnotations(YourClass.class, MixIn.class); 

编辑:

由于评论,与jackson2.5 +,API已经改变,应该调用objectMapper.addMixIn(Class<?> target, Class<?> mixinSource)

另一种可能性是,如果你想忽略所有未知的属性,你可以configuration映射器如下:

 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

使用Java类

 new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

使用注释

 @JsonIgnoreProperties(ignoreUnknown=true) 

如前所述,混合注释在这里工作得非常好。 除了每个属性@JsonIgnore之外的另一个可能性是如果你有一个永远不应该被包含的types(即,如果所有的GeometryCollection属性的实例都应该被忽略),就使用@JsonIgnoreType。 然后,您可以直接添加(如果您控制该types),或使用混合,如:

 @JsonIgnoreType abstract class MixIn { } // and then register mix-in, either via SerializationConfig, or by using SimpleModule 

如果你有很多类都有一个单独的'IgnoredType getContext()'访问器,那么这会更方便一些(许多框架就是这种情况)

 public @interface JsonIgnoreProperties 

注释可用于抑制属性的序列化(在序列化期间),或者忽略处理JSON属性的读取(在反序列化期间)。

要防止指定的字段被序列化或反序列化,您可以使用:

 @JsonIgnoreProperties(ignoreUnknown=true) 

我有一个类似的问题,但它与Hibernate的双向关系有关。 我想展示关系的一个方面,并根据我正在处理的观点,在程序上忽略另一方。 如果你不能这样做,你最终会遇到讨厌的StackOverflowException 。 例如,如果我有这些对象

 public class A{ Long id; String name; List<B> children; } public class B{ Long id; A parent; } 

如果我正在查看A,我想要以编程方式忽略B中的parent字段,如果我正在查看B,则忽略A中的children字段。

我开始使用mixin来做到这一点,但这很快就变得可怕了。 你有太多无用的类只是为了格式化数据而存在。 我结束了写我自己的序列化器来处理这个更清洁的方式: https : //github.com/monitorjbl/json-view 。

它允许您以编程方式指定要忽略的字段:

 ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(JsonView.class, new JsonViewSerializer()); mapper.registerModule(module); List<A> list = getListOfA(); String json = mapper.writeValueAsString(JsonView.with(list) .onClass(B.class, match() .exclude("parent"))); 

它还使您可以通过通配符匹配器轻松指定非常简化的视图:

 String json = mapper.writeValueAsString(JsonView.with(list) .onClass(A.class, match() .exclude("*") .include("id", "name"))); 

在我原来的情况下,像这样简单的看法的需要是显示关于父母/孩子的最低限度,但它也成为我们基于angular色的安全有用。 为了返回关于对象的更less的信息,需要较less特权的对象视图。

所有这些都来自序列化程序,但是我在我的应用程序中使用了Spring MVC。 为了正确处理这些情况,我写了一个集成,您可以将其放入现有的Spring控制器类中:

 @Controller public class JsonController { private JsonResult json = JsonResult.instance(); @Autowired private TestObjectService service; @RequestMapping(method = RequestMethod.GET, value = "/bean") @ResponseBody public List<TestObject> getTestObject() { List<TestObject> list = service.list(); return json.use(JsonView.with(list) .onClass(TestObject.class, Match.match() .exclude("int1") .include("ignoredDirect"))) .returnValue(); } } 

两者都可以在Maven Central上find。 我希望它能帮助别人,这对jackson来说是一个特别难看的问题,对我的情况来说,这个问题没有很好的解决办法。

基于注解的方法更好。 但有时需要手动操作。 为此,您可以使用ObjectWriter的方法。

 ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) ObjectWriter writer = mapper.writer().withoutAttribute("property1").withoutAttribute("property2"); String jsonText = writer.writeValueAsString(sourceObject); 

还有一个好处就是使用@JsonFilter 。 这里的一些细节http://wiki.fasterxml.com/JacksonFeatureJsonFilter