Serializing with Jackson (JSON) - obtenir "No serializer found"?

j'obtiens une exception quand j'essaie de sérialiser un objet très simple en utilisant Jackson. L'erreur:

org.codehaus.Jackson.cartographie.JsonMappingException: aucun serializer trouvé pour classe MyPackage.TestA et pas de propriétés découvert pour créer BeanSerializer (pour éviter l'exception, désactiver SerializationConfig.Caractéristique.FAIL_ON_EMPTY_BEANS))

ci-dessous est la classe simple et le code à sérialiser.

Quelqu'un peut-il me dire pourquoi j'ai eu cette erreur?

public class TestA {
    String SomeString = "asd";
}

TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
    String testAString = om.writeValueAsString(testA); // error here!

    TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
194
demandé sur Ted 2011-12-03 15:26:13

14 réponses

comme déjà décrit, la configuration par défaut d'une instance ObjectMapper est de n'accéder qu'aux propriétés qui sont des champs publics ou qui ont des getters/setters publics. Une alternative à la modification de la définition de classe pour rendre un champ public ou pour fournir un getter/setter public est de spécifier (à la VisibilityChecker sous-jacente ) une règle de visibilité de propriété différente. Jackson 1.9 fournit la méthode pratique ObjectMapper.setVisibility() pour ce faire. Pour l'exemple de la question originale, je dirais configurez ceci comme

myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

pour plus d'information et de détails sur les options de configuration connexes, je recommande d'examiner les JavaDocs sur ObjectMapper.setVisibility() .

246
répondu Programmer Bruce 2016-03-08 11:54:54

pour que Jackson sérialise cette classe, le champ SomeString doit être public (en ce moment c'est l'isolation au niveau du paquet) ou vous devez définir les méthodes getter et setter pour cela.

58
répondu Chris 2017-07-22 17:24:54

j'ai le même problème dans mon code source. Je viens d'ajouter

getter

et

setter

le problème est résolu.

24
répondu Günay Gültekin 2015-10-12 16:36:11

le problème dans mon cas était que Jackson essayait de sérialiser un objet vide sans attributs ni méthodes.

comme suggéré dans l'exception j'ai ajouté la ligne suivante pour éviter l'échec sur les haricots vides:

Pour Jackson 1.9

myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

Pour Jackson 2.X

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

Vous pouvez trouver un exemple simple sur jackson désactiver fail_on_empty_beans

17
répondu Martín C 2017-07-22 17:22:28

cette erreur est également lancée si vous oubliez d'ajouter le .méthode build () sur votre statut de retour.

return Response.status(Status.OK);         // fails
return Response.status(Status.OK).build(); // works

j'ai obtenu l'erreur suivante sans la méthode build ():

org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl
5
répondu patrics 2013-05-07 13:25:02

si vous pouvez éditer la classe contenant cet objet, je n'ai qu'à ajouter l'annotation

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;
5
répondu ZiglioUK 2015-01-16 02:57:21

j'ai eu le même problème pour une classe d'enfant où j'avais le contrôle, objet mapper était dans un module commun et était inaccessible. Je l'ai résolu en ajoutant cette annotation pour ma classe d'enfant dont l'objet devait être sérialisé.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
5
répondu Pavan Kumar 2018-01-31 08:44:53

pour les applications Java D'Oracle, ajouter ceci après ObjectMapper instanciation:

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
3
répondu LEM Adane 2017-07-22 17:23:46

le problème peut être dû au fait que vous avez déclaré la variable private . Si vous le changez en public , ça marche.

Meilleure option est d'utiliser les méthodes getter et setter.

cela résoudra le problème!

2
répondu Sanchit Singhania 2017-07-22 17:23:15

j'ai eu un problème similaire avec le chargement paresseux via l'objet proxy hibernate. A contourné en annotant la classe ayant paresseux chargé propriétés privées avec:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
1
répondu N. berouain 2017-05-03 14:56:30

Voici les trois options:

  1. données / classe qui ont été consultées doit être public
  2. si non public , ajouter getters & setters
  3. ou ajouter @JsonIgnore("context")
1
répondu Santhosh Kumar 2018-08-08 08:35:23

bien que j'ai ajouté getters et setters j'ai eu la même erreur. Plus tard j'ai trouvé un bug, c'est-à-dire par le Conseil de Sonar j'ai cgahnged les getters et les setters comme protégé qui causait le problème. Une fois que j'ai réglé ça, ça a fonctionné comme prévu.

0
répondu yellow 2017-10-31 16:23:27

j'ai trouvé au moins trois façons de faire ceci:

  1. Ajouter public getters sur votre entité que vous essayez de sérialiser;
  2. Ajouter une annotation en haut de l'entité, si vous ne voulez pas public getters . Cela changera la valeur par défaut pour Jackson de Visbility=DEFAULT à @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) où tous les modificateurs d'accès sont acceptés;
  3. changez votre ObjectMapper globalement en mettant objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY); . Ceci doit être évité si vous n'avez pas besoin de cette fonctionnalité à l'échelle mondiale.

choisissez en fonction de vos besoins.

0
répondu georger 2018-07-06 11:07:18

SpringBoot2.0 code: 151920920"

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
0
répondu Janus 2018-09-08 09:58:06