Sérialiser un object sans données dans Jackson

Est-il possible de sérialiser un object sans champs dans Jackson en utilisant uniquement des annotations? Lorsque je tente de sérialiser un tel object sans annotations, je reçois:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class [redacted].SubjectObjectFeatureExtractor and no properties discovered to create BeanSerializer 

J’ai examiné la liste des annotations de Jackson sans trouver un moyen d’annoter la classe sans données sérialisables. J’ai essayé de mettre @JsonCreator sur le constructeur vide (je ne m’attendais pas à ce qu’il fonctionne, car il s’agit d’une annotation de désérialisation) et j’ai la même erreur. Il n’y a pas d’accesseurs ni de champs sur @JsonProperty mettre @JsonProperty . Des idées?

Mise à jour: la raison en est que j’ai une liste d’objects représentant des transformations pouvant être appliquées à un certain type de données. Certaines de ces transformations sont définies par des parameters qui doivent être sérialisés, mais certaines sont sans paramètre (les objects sans données en question). J’aimerais pouvoir sérialiser et désérialiser une séquence de ces transformations. De plus, j’utilise DefaultTyping.NON_FINAL pour que le nom de la classe soit sérialisé.

Mise à jour: un exemple de classe serait

 class ExtractSomeFeature implements FeatureExtractor { public void extractFeature(SomeOtherType obj, WeightedFeatureList output) { // do stuff } } 

Je ne me soucie pas vraiment de l’apparence du JSON, à condition de pouvoir désérialiser correctement les List . Mon impression est que, en utilisant la saisie par défaut, le JSON attendu serait quelque chose comme:

 ['com.mycompany.foo.ExtractSomeFeature', {}] 

Les autres sous-classes de FeatureExtractor auraient de vrais parameters, elles ressembleraient donc à quelque chose comme:

 [`com.mycompany.foo.SomeParameterizedFeature', {some actual JSON stuff in here}] 

Je pense que je pourrais utiliser @JsonValue sur certaines toJSONSsortingng() pour renvoyer {} , mais si possible, j’aimerais masquer ce piratage aux utilisateurs finaux qui FeatureExtractor sous-classes FeatureExtractor .

Vous devez configurer votre mappeur d’objects pour prendre en charge ce cas.

 ObjectMapper objectMapper = ... objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

La documentation de cette fonctionnalité que vous pouvez trouver ici: Échec sur des poutres vides

Fonction qui détermine ce qui se produit lorsqu’aucun accesseur n’est trouvé pour un type (et qu’il n’y a pas d’annotations indiquant qu’il est censé être sérialisé). Si activé (par défaut), une exception est générée pour indiquer qu’il s’agit de types non sérialisables. si elles sont désactivées, elles sont sérialisées en tant qu’objects vides, c’est-à-dire sans propriétés.

L’ajout de l’annotation suivante à la classe semble résoudre le problème:

 @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE) 

Ajout d’un annoté non lié comme

 @JsonRootName("fred") 

semble également le réparer. Cela semble correspondre à l’affirmation dans le ticket JIRA voulant que l’ajout d’une annotation de Jackson à la classe empêche l’exception. Cependant, il semble que l’ajout d’annotations au sein de la classe ne le soit pas.

Je ne suis pas sûr de comprendre votre question, mais vous voulez peut-être JsonInclude.Include.NON_DEFAULT , JsonInclude.Include.NON_NULL ou JsonInclude.Include. NON_EMPTY .