web-dev-qa-db-fra.com

Sérialisation avec Jackson (JSON) - Obtenir "Aucun sérialiseur trouvé"?

Je reçois une exception lorsque j'essaie de sérialiser un objet très simple à l'aide de Jackson. L'erreur:

org.codehaus.jackson.map.JsonMappingException: aucun sérialiseur trouvé pour classe MyPackage.TestA et pas de propriétés découvert pour créer BeanSerializer (pour éviter les exceptions, désactivez SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))

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

Quelqu'un peut-il dire pourquoi je reçois 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();
}
211
Ted

Comme cela a déjà été décrit, la configuration par défaut d'une instance ObjectMapper consiste à accéder uniquement aux propriétés qui sont des champs publics ou à 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 variable VisibilityChecker sous-jacente) une règle de visibilité de propriété différente. Jackson 1.9 fournit la méthode de commodité ObjectMapper.setVisibility() pour le faire. Pour l'exemple de la question initiale, je configurerais probablement ceci en tant que

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

Pour plus d'informations et de détails sur les options de configuration associées, je vous recommande de consulter les JavaDocs sur ObjectMapper.setVisibility() .

279
Programmer Bruce

Pour que Jackson puisse sérialiser cette classe, le champ SomeString doit être soit public (actuellement c'est l'isolation au niveau du paquet) ou vous devez définir des méthodes getter et setter pour celle-ci.

64
Chris

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

getter

et 

setter

le problème résolu.

35
Günay Gültekin

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 les erreurs sur les beans 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 disable fail_on_empty_beans

20
Martín C

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

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
6
Pavan Kumar

Cette erreur est également générée si vous oubliez d'ajouter la méthode .build () à votre statut de retour.

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

J'ai eu 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
patrics

Si vous pouvez éditer la classe contenant cet objet, d'habitude j'ajoute simplement l'annotation

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;
5
ZiglioUK

Pour les applications Oracle Java, ajoutez ceci après l’instanciation ObjectMapper

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
3
LEMUEL ADANE

Le problème peut être dû au fait que vous avez déclaré variable en tant que private. Si vous le changez en public, cela fonctionne.

La meilleure option consiste à utiliser les méthodes getter et setter.

Cela résoudra le problème!

2
Sanchit Singhania

Voici les trois options:

  1. Les données/classes auxquelles on a accédé doivent être public
  2. Sinon public, ajoutez getters & setters
  3. Ou ajoutez @JsonIgnore("context")
2
Santhosh Kumar

J'ai trouvé au moins trois façons de le faire:

  1. Ajoutez public getters sur votre entité que vous essayez de sérialiser;
  2. Ajoutez 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. Modifiez votre ObjectMapper globalement en définissant objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);. Ceci devrait être évité si vous n'avez pas besoin de cette fonctionnalité globalement.

Choisissez en fonction de vos besoins.

1
georger

J'ai eu un problème similaire avec le chargement différé via l'objet proxy hibernate. Pour contourner le problème, annotez à la classe les propriétés privées chargées paresseuses avec

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
1
N. berouain

Bien que j'ajoute des accesseurs et des setters, j'obtiens la même erreur. Plus tard, j’ai trouvé un bug, c’est sur les conseils de Sonar que j’ai classé les getters et les setters comme protégés, ce qui était à l’origine du problème. Une fois, j'ai corrigé que cela fonctionnait comme prévu.

0
yellow

SpringBoot2.0 , Je le résous en suivant le code:

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
0
Janus