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


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

Org.codehaus.jackson.asignar.JsonMappingException: No se ha encontrado ningún serializador para clase MyPackage.TestA y sin propiedades descubierto para crear BeanSerializer (para evitar excepciones, deshabilitar SerializationConfig.Función.FAIL_ON_EMPTY_BEANS) )

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

¿Puede alguien decirme por qué recibo 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();
}
Author: Ted, 2011-12-03

14 answers

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

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().

 246
Author: Programmer Bruce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-08 11:54:54

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

 58
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:24:54

Tengo el mismo problema en mi código fuente. Acabo de añadir

Getter

Y

Setter

El problema resuelto.

 24
Author: Günay Gültekin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-12 16:36:11

El problema en mi caso fue que Jackson estaba tratando de serializar un objeto vacío sin atributos ni métodos.

Como se sugirió en la excepción, agregué la siguiente línea para evitar errores en frijoles 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);

Puedes encontrar un ejemplo sencillo en jackson disable fail_on_empty_beans

 17
Author: Martín C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:22:28

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

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
 5
Author: patrics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 13:25:02

Si puedes editar la clase que contiene ese objeto, normalmente solo añado la anotación

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;
 5
Author: ZiglioUK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-16 02:57:21

Tuve el mismo problema para una clase hija donde tenía control, object mapper 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)
 5
Author: Pavan Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-31 08:44:53

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

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
 3
Author: LEM Adane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:23:46

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

Mejor opción es usar los métodos getter y setter para ello.

Esto resolverá el problema!

 2
Author: Sanchit Singhania,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:23:15

Tuve un problema similar con la carga lenta a través del objeto proxy hibernate. Se sorteó anotando la clase que tiene propiedades privadas cargadas perezosamente con:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
 1
Author: N. berouain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-03 14:56:30

Aquí están las tres opciones:

  1. Los datos / clase a los que se ha accedido deben ser public
  2. Si no public, agregue getters & setters
  3. O añadir @JsonIgnore("context")
 1
Author: Santhosh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-08 08:35:23

Aunque he añadido getters y setters estaba recibiendo el mismo error. Más tarde encontré un error, que es por el consejo de Sonar cgahnged los getters y setters como protegidos que estaba causando el problema. Una vez arreglé que funcionaba como exppected.

 0
Author: yellow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-31 16:23:27

Encontré al menos tres maneras de hacer esto:

  1. Agrega public getters en tu entidad que intentas 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.

 0
Author: georger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 11:07:18

SpringBoot2. 0 ,lo resuelvo siguiendo el código:

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
 0
Author: Janus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 09:58:06