Comment puis-je dire à jackson d’ignorer une propriété pour laquelle je ne contrôle pas le code source?

Bref, une de mes entités a une GeometryCollection qui lance une exception lorsque vous appelez “getBoundary” (le pourquoi de ceci est un autre livre, pour l’instant, disons que c’est comme ça que ça fonctionne).

Est-il possible de dire à Jackson de ne pas inclure ce getter spécifique? Je sais que je peux utiliser @JacksonIgnore lorsque je possède / contrôle le code. Mais ce n’est pas le cas, jackson se termine à ce stade par la sérialisation continue des objects parents. J’ai vu une option de filtrage dans la documentation de jackson. Est-ce une solution plausible?

Merci!

Vous pouvez utiliser Jackson Mixins . Par exemple:

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

Avec ce mixin

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

Avec ça:

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

Modifier:

Grâce aux commentaires, avec Jackson 2.5+, l’API a été modifiée et devrait être appelée avec objectMapper.addMixIn(Class target, Class mixinSource)

Une autre possibilité est que, si vous souhaitez ignorer toutes les propriétés inconnues, vous pouvez configurer le mappeur comme suit:

 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

Utilisation de la classe Java

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

Utiliser l’annotation

 @JsonIgnoreProperties(ignoreUnknown=true) 

Les annotations de mixage fonctionnent assez bien ici comme déjà mentionné. Une autre possibilité au-delà de @JsonIgnore par propriété est d’utiliser @JsonIgnoreType si vous avez un type qui ne devrait jamais être inclus (c’est-à-dire si toutes les instances des propriétés GeometryCollection doivent être ignorées). Vous pouvez alors soit l’append directement (si vous contrôlez le type), soit utiliser le mixage, comme:

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

Cela peut être plus pratique si vous avez beaucoup de classes qui ont toutes un seul accesseur “IgnoredType getContext ()” (ce qui est le cas pour de nombreux frameworks).

 public @interface JsonIgnoreProperties 

Annotation pouvant être utilisée pour supprimer la sérialisation des propriétés (pendant la sérialisation) ou pour ignorer le traitement des propriétés JSON lues (pendant la désérialisation).

Pour empêcher les champs spécifiés d’être sérialisés ou désérialisés, vous pouvez utiliser:

 @JsonIgnoreProperties(ignoreUnknown=true) 

J’ai eu un problème similaire, mais il était lié aux relations bidirectionnelles d’Hibernate. Je voulais montrer un côté de la relation et ignorer par programmation l’autre, en fonction de la vision que je traitais. Si vous ne pouvez pas faire cela, vous vous retrouvez avec StackOverflowException . Par exemple, si j’avais ces objects

 public class A{ Long id; Ssortingng name; List children; } public class B{ Long id; A parent; } 

Je voudrais ignorer par programmation le champ parent dans B si je regardais A et ignorer le champ children dans A si je regardais B.

J’ai commencé à utiliser des mixins pour cela, mais cela devient très vite horrible. vous avez tellement de classes inutiles qui existent uniquement pour formater des données. J’ai fini par écrire mon propre sérialiseur pour gérer cela de manière plus propre: https://github.com/monitorjbl/json-view .

Il vous permet de spécifier par programme quels champs ignorer:

 ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(JsonView.class, new JsonViewSerializer()); mapper.registerModule(module); List list = getListOfA(); Ssortingng json = mapper.writeValueAsSsortingng(JsonView.with(list) .onClass(B.class, match() .exclude("parent"))); 

Il vous permet également de spécifier facilement des vues très simplifiées grâce aux jokers:

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

Dans mon cas original, le besoin de vues simples comme celle-ci était de montrer le ssortingct minimum concernant le parent / enfant, mais il est également devenu utile pour notre sécurité basée sur les rôles. Vues moins privilégiées des objects nécessaires pour retourner moins d’informations sur l’object.

Tout cela vient du sérialiseur, mais j’utilisais Spring MVC dans mon application. Pour le faire gérer correctement ces cas, j’ai écrit une intégration que vous pouvez inclure dans les classes de contrôleurs Spring existantes:

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

Les deux sont disponibles sur Maven Central. J’espère que cela aidera quelqu’un d’autre, c’est un problème particulièrement moche avec Jackson qui n’a pas eu une bonne solution pour mon cas.

Une approche basée sur les annotations est préférable. Mais parfois, un fonctionnement manuel est nécessaire. Pour cela, vous pouvez utiliser sans méthode ObjectWriter .

 ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) ObjectWriter writer = mapper.writer().withoutAtsortingbute("property1").withoutAtsortingbute("property2"); Ssortingng jsonText = writer.writeValueAsSsortingng(sourceObject); 

Un autre bon point ici est d’utiliser @JsonFilter . Quelques détails ici http://wiki.fasterxml.com/JacksonFeatureJsonFilter