Depuis JPatform 10, une bibliothèque JSON (jackson 2.x) a été intégrée. En particulier cette possibilité est utilisable dans les API
(Restricted access link)
.
Utilisation
La bibliothèque Jackson se base sur l'objet ObjectMapper
pour effectuer ces actions de sérialisation/déserialisation. Dans JPlatform, une instance de cet objet est disponible, préconfiguré avec les problématiques JPlatform (suppression des boucles de sérialisation, gestion de la profondeur, ...).
Pour accéder à cet objet, il faut passer par le builder com.jalios.jcms.json.ObjectMapperBuilder
, comme par exemple
try {
ObjectMapperBuilder objectMapperBuilder = new ObjectMapperBuilder();
return objectMapperBuilder.getMapper().writeValueAsString(data);
} catch (JsonProcessingException e) {
logger.warn("Cannot convert ressource to JSON data ", e);
}
Processus de création de l'instance ObjectMapper
- Préconfiguration du mapper avec les attributs suivants :
- DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) : desactivé
- DeserializationFeature.READ_ENUMS_USING_TO_STRING) : activé
- MapperFeature.PROPAGATE_TRANSIENT_MARKER : true
- setSerializationInclusion : Include.NON_NULL
- Configuration du format de date (par défaut "yyyy-MM-dd'T'HH:mm:ss'Z'")
- Ajout des mixins pointés par les objets de configurations (contenu de les configurations de la Map jsonConfigurationMap)
- Configuration des filtres (selon les listes d'inclusion/exclusion données dans les éléments de configuration)
- Ajout à la volée des filtres jackson si besoin
- Ajout du CustomJsonSerializer (avec une profondeur de 1 par défaut)
La classe CustomJsonSerializer sérialise les objets mais avec les fonctionnalités suivantes :
- ajout pour tout les objets l'attribut
class
- Si la données est une instance de BasicStorable, ajout de l'attribut
id
- Gestion de la profondeur : si le serializer est réappellé et que le compteur de profondeur dépasse la configuration, les Data, WFState et Plugin sont serializé différement :
- pour les Data, uniquement les attributs
class
et id
- pour les membres, ajout en plus du
login
et du fullName
- pour les groupes, ajout du
name
- pour les Publication, ajout du
title
- pour les WFState, les attributs
class
, pstatus
, label
- pour les Plugin, les attributs
class
, name
, enabled
Enfin les classes de configuration (mixin + exclusions) sont fournies par défaut pour :
- Member.class : MemberDefaultJsonConfiguration
- Data.class : DataDefaultJsonConfiguration
- Publication.class : PublicationDefaultJsonConfiguration
- Workspace.class : WorkspaceDefaultJsonConfiguration
- Workflow.class : WorkflowDefaultJsonConfiguration
- WFState.class : WFStateDefaultJsonConfiguration
- WFRole.class : WFRoleDefaultJsonConfiguration
- Plugin.class : PluginDefaultJsonConfiguration
- Category.class : CategoryDefaultJsonConfiguration
- Group.class : GroupDefaultJsonConfiguration
- DBMember.class : DBMemberDefaultJsonConfiguration
- FileDocument.class : FileDocumentDefaultJsonConfiguration
- TypeEntry.class : TypeEntryDefaultJsonConfiguration
Note : Les mixins contiennent les champs qu'il ne faut pas sérialiser (problème de boucle de sérialisation) alors que les Set d'exclusion contiennent les champs que l'on ne souhaite pas exporter par défaut (mais ne posant pas de problème).
Personnalisation de l'ObjectMapper
La personnalisation de l'ObjectMapper est possible via le builder :
- Utilisation d'un format de date personnalisé : via la méthode
ObjectMapperBuilder.setDateFormat
- Ignorer complétement la configuration par défaut : via la méthode
ObjectMapperBuilder.ignoreDefaultDataConfiguration
.
Si cette option est activée, tout les mixins et les filtres par défaut sont ignorés. Il convient donc de fournir tout les éléments nécessaires pour effectuer la sérialisation (en évitant les boucles de serialisation).
- Exclure toutes les propriétés : via la propriété
ObjectMapperBuilder.excludeAllProperties
.
Dans ce cas, les règles d'inclusion fournies dans les instances de configuration sont ignorées et uniquement les règles décrites dans les propriétés includedPropertyMap et excludedPropertyMap sont prises en compte.
- Ajouter des champs à inclure/exclure par rapport à la configuration par défaut : via les propriétés
ObjectMapperBuilder.includedPropertyMap
et ObjectMapperBuilder.excludedPropertyMap
- Ajout/Remplacement d'une classe de configuration (une sous classe de com.jalios.jcms.json.configurations.JsonConfiguration) : via la méthode
ObjectMapperBuilder.replaceDefaultJsonConfiguration