Serializando con Jackson (JSON): ¿aparece el mensaje "No se encontró ningún serializador"?

Resuelto Ted asked hace 13 años • 24 respuestas

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();
}
Ted avatar Dec 03 '11 18:12 Ted
Aceptado

Como ya se describió, la configuración predeterminada de una ObjectMapperinstancia 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() .

Programmer Bruce avatar Dec 06 '2011 05:12 Programmer Bruce

Agrega un

adquiridor

y un

setter

y el problema está solucionado.

Günay Gültekin avatar Oct 12 '2015 16:10 Günay Gültekin

Para que Jackson serialice esa clase, el SomeStringcampo debe ser public(en este momento es aislamiento a nivel de paquete) o debe definir métodos getter y setter para él.

Chris avatar Dec 03 '2011 11:12 Chris

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

Martín C avatar Sep 27 '2014 18:09 Martín C