serialize example java json jackson

example - objectmapper java



Serialización con Jackson(JSON): ¿se ha "No se ha encontrado un serializador"? (14)

Aquí están las tres opciones:

  1. Los datos / clase a los que se ha accedido deben ser public
  2. Si no es public , agregue getters y setters
  3. O agregue @JsonIgnore("context")

Obtengo una excepción al intentar serializar un objeto muy simple utilizando 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 excepciones, desactive SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))

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

¿Alguien puede decirme a mi 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(); }


Aunque añadí getters y setters estaba recibiendo el mismo error. Más tarde, encontré un error, que es por el consejo de Sonar, puse en contacto a los captadores y configuradores como protegidos, lo que estaba causando el problema. Una vez arreglado que funcionó como se esperaba.


Como ya se describió, la configuración predeterminada de una instancia de ObjectMapper es acceder solo a las propiedades que son campos públicos o que tienen captadores / definidores públicos. Una alternativa a cambiar la definición de clase para hacer público un campo o proporcionar un captador / definidor público es especificar (para el 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 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() .


El problema en mi caso era que Jackson estaba tratando de 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 en jackson disable fail_on_empty_beans


El problema puede ser porque ha declarado la variable como private . Si lo cambias a public , funciona.

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

¡Esto resolverá el problema!


Encontré al menos tres formas de hacer esto:

  1. Agregue public getters a su entidad que intenta serializar;
  2. Agregue una anotación en la parte superior de la entidad, si no desea que 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.

Elige según tus necesidades.


Este error también se produce si olvida agregar el método .build () a 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 Java de Oracle, agregue esto después de la ObjectMapper instancias de ObjectMapper :

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


Para que Jackson SomeString esa clase, el campo SomeString debe ser public (en este momento es el aislamiento a nivel de paquete) o debe definir los métodos de captador y definidor para ello.


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

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


SpringBoot2.0, lo resuelvo mediante el siguiente código:

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


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

adquiridor

y

setter

El problema resuelto.


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

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)


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

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