Bienvenue

Jalios Community

Tout ce que vous souhaitez savoir sur l'écosystème Jalios

Utilisation de JSON au sein de JPlatform

  • Rédacteur :
  • Date de modification : 21/09/2018

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

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

Aucun commentaire