¿Serializar con Jackson (JSON) – obteniendo “No se encontró un serializador”?

Obtengo la excepción cuando trato de serializar un objeto muy simple usando Jackson. El error:

org.codehaus.jackson.map.JsonMappingException: no se encontró un serializador para la clase MyPackage.TestA y no se descubrieron propiedades para crear BeanSerializer (para evitar la excepción, deshabilite SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))

A continuación se muestra la clase simple y el código para serializar.

¿Alguien puede decirme por qué me sale este error?

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(); } 

Como ya se ha descrito, la configuración predeterminada de una instancia de ObjectMapper es acceder solo a las propiedades que son campos públicos o tienen getters / setters públicos. Una alternativa para cambiar la definición de clase para hacer público un campo o proporcionar un getter / setter público es especificar (a VisibilityChecker subyacente) una regla de visibilidad de propiedad diferente. Jackson 1.9 proporciona el método de conveniencia ObjectMapper.setVisibility() para hacerlo. Por ejemplo, en la pregunta original, probablemente configuraría esto como

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

Para obtener más información y detalles sobre las opciones de configuración relacionadas, recomiendo revisar los JavaDocs en ObjectMapper.setVisibility() .

Para que Jackson SomeString esa clase, el campo SomeString debe ser public (ahora es el aislamiento del nivel de paquete) o necesita definir métodos getter y setter para él.

Tengo el mismo problema en mi código fuente. Acabo de agregar

adquiridor

y

setter

el problema resuelto

El problema en mi caso era que Jackson intentaba serializar un objeto vacío sin atributos ni métodos.

Como se sugiere en la excepción, agregué la siguiente línea para evitar fallas en beans vacíos:

Para Jackson 1.9

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

Para Jackson 2.X

 myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

Puede encontrar un ejemplo simple sobre la desactivación de jackson fail_on_empty_beans

Si puede editar la clase que contiene ese objeto, generalmente solo agrego la anotación

 import com.fasterxml.jackson.annotation.JsonIgnore; @JsonIgnore NonSerializeableClass obj; 

Tuve el mismo problema para una clase infantil donde tenía el control, el mapeador de objetos estaba en un módulo común y era inaccesible. Lo resolví agregando esta anotación para mi clase hija cuyo objeto iba a ser serializado.

 @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) 

Este error también se produce si olvida agregar el método .build () en su estado de devolución.

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

Obtuve el siguiente error sin el método build ():

 org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl 

Para las aplicaciones de Oracle Java, agregue esto después de la instanciación de ObjectMapper :

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

El problema puede deberse a que ha declarado la variable como private . Si lo cambia a public , funciona.

La mejor opción es usar métodos getter y setter para ello.

¡Esto resolverá el problema!

Tuve un problema similar con la carga diferida a través del objeto proxy de hibernación. Lo rodeé anotando la clase que tiene propiedades privadas cargadas perezosas con:

 @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 

Estas son las tres opciones:

  1. La información / clase a la que se ha accedido debe ser public
  2. Si no es public , agregue getters y setters
  3. O agregue @JsonIgnore("context")

Aunque agregué getters y setters, estaba obteniendo el mismo error. Más tarde encontré un error, es decir, por consejo de Sonar, informé a los getters y setters como protegidos lo que estaba causando el problema. Una vez que lo arreglé, funcionó como se esperaba.

Encontré al menos tres formas de hacer esto:

  1. Agregue public getters en su entidad que intente serializar;
  2. Agregue una anotación en la parte superior de la entidad, si no desea public getters . Esto cambiará el valor predeterminado para Jackson de Visbility=DEFAULT a @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) donde se aceptan los modificadores de acceso;
  3. Cambie su ObjectMapper globalmente configurando objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY); . Esto debe evitarse si no necesita esta funcionalidad globalmente.

Elija según sus necesidades.