我怎么能告诉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