library databind java jackson

java - databind - jackson vs gson



¿Jackson sin anotaciones absolutamente requiere Setters? (1)

Estoy usando Jackson 1.6.4 y Java JDK 6.

No quiero usar las anotaciones de Jackson; Quiero tener objetos Java inmutables sin setters.

Los dos requisitos parecen entrar en conflicto.

Si agrego la deserialización de setters privados funciona bien.

Estoy tratando de no recurrir a setters privados para mis objetos inmutables, soy terco de esa manera.

Estoy en el proceso de intentar una implementación personalizada de VisibilityChecker para permitir el acceso a CUALQUIER campo.

Pero si alguien tiene algunos consejos o lecciones aprendidas que puedan compartir, les agradecería escucharlos.

ACTUALIZACIÓN: Está funcionando.

Patrón de constructor, constructor privado - a la Bloch "Java efectiva".

Se necesitó establecer la configuración y visibilidad de la deserialización, pero ahora está bien.

public class JsonMapper { private static final int INITIAL_SIZE = 2048; /** See http://wiki.fasterxml.com/JacksonBestPracticeThreadSafety?highlight=(/bCategoryJackson/b) */ private static ObjectMapper mapper; static { mapper = new ObjectMapper(); mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); SerializationConfig serializationConfig = mapper.getSerializationConfig(); serializationConfig.setDateFormat(Person.DEFAULT_FORMATTER); mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false); DeserializationConfig deserializationConfig = mapper.getDeserializationConfig(); deserializationConfig.setDateFormat(Person.DEFAULT_FORMATTER); deserializationConfig.enable(DeserializationConfig.Feature.AUTO_DETECT_FIELDS); mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY)); } public static <T> String serialize(T o) throws IOException { StringWriter sw = new StringWriter(INITIAL_SIZE); mapper.writeValue(sw, o); return sw.toString(); } public static <T> T deserialize(String source, Class<T> targetClass) throws IOException { ByteArrayInputStream stream = new ByteArrayInputStream(source.getBytes()); TreeTraversingParser treeTraversingParser = new TreeTraversingParser(mapper.readTree(stream)); treeTraversingParser.setCodec(mapper); return treeTraversingParser.readValueAs(targetClass); } }


Me alegra saber que lo hizo funcionar: la capacidad de cambiar los niveles de visibilidad de la autodetección es una característica muy poderosa, pero hay tantas características que no es trivial encontrar todo lo que hay.

Un par de punteros adicionales: si no desea agregar anotaciones de Jackson en los POJO, aún puede usar anotaciones de mezcla . Con esto, puede usar @JsonCreator para especificar un constructor no predeterminado para usar, lo que permite verdaderos tipos de valores inmutables (más sobre Jackson y tipos inmutables en este artículo ).

Y finalmente: aunque el patrón de constructor aún no se admite directamente, se ha planificado según esta entrada de Jira .