Serializando con Jackson (JSON): ¿aparece el mensaje "No se encontró ningún serializador"?
Recibo una excepción al intentar serializar un objeto muy simple usando Jackson. El error:
org.codehaus.jackson.map.JsonMappingException: no se encontró ningún serializador para la clase MyPackage.TestA y no se descubrieron propiedades para crear BeanSerializer (para evitar excepciones, deshabilite SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
A continuación se muestran la clase y el código simples para serializar.
¿Alguien puede decirme por qué aparece 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 describió, la configuración predeterminada de una ObjectMapper
instancia es acceder solo a 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 (al subyacente VisibilityChecker
) una regla de visibilidad de propiedad diferente. Jackson 1.9 proporciona el ObjectMapper.setVisibility()
método conveniente para hacerlo. Para el ejemplo de la pregunta original, probablemente configuraría esto como
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Para Jackson >2.0:
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
Para obtener más información y detalles sobre las opciones de configuración relacionadas, recomiendo revisar los JavaDocs enObjectMapper.setVisibility()
.
Agrega un
adquiridor
y un
setter
y el problema está solucionado.
Para que Jackson serialice esa clase, el SomeString
campo debe ser public
(en este momento es aislamiento a nivel de paquete) o debe definir métodos getter y setter para él.
El problema en mi caso fue que Jackson estaba intentando 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 deshabilitar fail_on_empty_beans