[API] Serialisation/Déserialisation des données "Fields"

Bonjour,

J’ai fait quelques tests sur la possibilité d’utiliser les Apis Kizeo.
Et j’ai été surpris de la manière dont sont générés les « Fields »

Je prends un exemple avec un champ « photo ».

   "photo1": {
                "caption": "Photo",
                "type": "photo",
                "required": false,
                "rgpd_personal_data": false,
                "word_del_line_if_empty": false,
                "multiple": false,
                "visible_formula": "",
                "visible_formula_json": "",
                "same_line": false,
                "weight": "1",
                "get_geolocation_special_fields": false,
                "dont_save_in_gallery": false,
                "read_only_for_modification": false,
                "help": "",
                "icon": "",
                "color": "",
                "max_dim_for_photo": "768"
            }

« photo1 » = Identifiant d’élément. ( modifiable )
« Type »:« photo » = type de l’objet. Et donc , info permettant de transformer ce json en classe.

Comment font les développeurs pour sérialiser « photo1 » , qui n’est pas un type fixe ?
Pour le coup c’est un contre sens que d’avoir une entête json « variable »

Le type devrait être l’entête du json , et « photo1 » une propriété au même niveau que type ou help ou icon …

Ce qu’on aurait dut avoir :
« photo »:{
(…)
« type »:« photo »,
« identifiantelement »:« photo1 »
(…)
}

Bonjour monsieur Parent,

Le tableau d’éléments dans le json représentant les champs d’un formulaire, peut par exemple en Java être une Map <String, Field>. C’est donc un système Tableau Clé / Valeur, dont les clés sont variables et d’un même type (String), et les valeurs d’un même type (par exemple un Field contenant les attributs du champ).

Bonne journée.

Bonjour ,

Pour le coup , je suis en C#
J’ai un json , et j’aimerai donc obtenir l’objet correspondant à un modèle de donnée ( Classe C# )

Si je reprends mon exemple plus haut ( en supprimant quelques propriétés )

 {
     "photo1": 
                    {
                    "caption": "Photo",
                    "type": "photo",
                    "weight": "1",
                    "get_geolocation_special_fields": false,
                    "max_dim_for_photo": "768"
                    }
}

J’ai une classe C# tel que :

    public class Photo1
    {
        [JsonProperty("caption")]
        public string Caption { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }

        [JsonProperty("weight")]
        public long Weight { get; set; }

        [JsonProperty("get_geolocation_special_fields")]
        public bool GetGeolocationSpecialFields { get; set; }

        [JsonProperty("max_dim_for_photo")]
        public long MaxDimForPhoto { get; set; }
    }

Et donc pour transformé le json => objet :

objPhoto= JsonSerializer.Deserialize<Photo1>(jsonString);

Voilà le problème.

Si l’api génère des « Field » avec des noms à chaque fois différent , il est impossible ( en tout cas en c# ) de correctement définir un modèle à un type de composant mis dans le formulaire.
Hormis en :

  • Appel à l’api
  • JSON => String
  • Découpage de la chaine de caractère pour récupérer chaque « Field »
  • Vérification du champ « Type » , puis mise à jour de l’objet C#

( C’est une solution , que je n’aurais pas le choix d’utiliser , mais elle n’est pas très … confortable , et surtout transformer du Json en string pour traiter les données dedans reste une mauvaise pratique :slight_smile: )


Question bonus :

Avez vous un swagger « complet » ?

Ce swagger ne présente pas toutes les propriétés des retours possibles. ( par exemple pour le
GET ​/forms​/{formId} )

https://www.kizeoforms.com/rest/v3/swagger.json

J’aimerai connaître la totalité des propriétés possibles pour tous les types de « composant kizeo » ajoutable dans un formulaire ? ( pour pouvoir créer une librairie C# qui permettrait à d’autres de « plus facilement » intégrer l’api Kizeo. )

Bonjour monsieur Parent,

Attention, si vous créez une classe qui sait gérer 5 attributs par exemple, il est nécessaire que dans le cas ou le nombre d’attributs augmente (7 ou 8 par exemple), cela fonctionne tout de même. En effet, de notre côté, nous pouvons, à tout moment, ajouter des options sur un champ. Par contre, pour des raisons de maintenabilité, nous n’en enlevons pas. Si cela devait se faire, ce serait à travers un nouvel endpoint.
Pour votre Mapping des champs, cela correspond, en C#, à un objet Dictionary avec pour clé un « String » et pour valeur un objet « Field ».

A aujourd’hui, nous n’avons pas de swagger complet.

En espérant avoir répondu à votre question.

Bonne journée.

Bonjour,

Concernant le swagger j’ai un cas précis.

J’ai envie de créer une interface qui va faire appel à l’api Kizeo.
J’ai un formulaire avec un « Champ de saisie ». ( Avec comme option : Numérique )

En réponse à l’appel à 'api j’ai un « SubType:« int » »

Comment puis je connaitre les différentes valeurs possibles pour ce SubType ?
Est ce que les valeurs possibles de ces champs fixes ( Enum ) sont répertoriés quelque part ?

Bonjour,
Les valeurs possibles sont aujourd’hui « text », « int », « double », « tel », « mail », « url ». D’autres sous-types pourront arriver dans le futur, et nous recommandons fortement de considérer tout autre type comme un « text ».
En espérant avoir répondu à votre question.

Bonjour ,

Vous avez bien répondu à « mon exemple » .

Mais ma question est plus générale , et pourrais se reformuler en

" S’il y a un champ avec plusieurs valeurs possible , comment puis je connaitre ses valeurs ? "

Bonjour,

Je vous invite à contacter directement le service support par téléphone au 04.90.23.67.60

Bonne journée.