Pour des raisons de maintenance du site, un arrêt du site aura lieu lundi 16 décembre 2019 à partir de 18H00, pour une durée estimée de 30 minutes.

Veuillez nous excuser pour les désagréments que cette opération pourrait causer.

We apologize for untranslated text, you can use the Google Translation button to get an automatic translation of the web page in the language of your choice.

Utilisation de JSON au sein de JPlatform

  • Authors :
  • Modification Date : 9/21/18

Depuis JPatform 10, une bibliothèque JSON (jackson 2.x) a été intégrée. En particulier cette possibilité est utilisable dans les API rest .

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

  1. 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
  2. Configuration du format de date (par défaut "yyyy-MM-dd'T'HH:mm:ss'Z'")
  3. Ajout des mixins pointés par les objets de configurations (contenu de les configurations de la Map jsonConfigurationMap)
  4. Configuration des filtres (selon les listes d'inclusion/exclusion données dans les éléments de configuration)
  5. Ajout à la volée des filtres jackson si besoin
  6. 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.
  • 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