# Application de workflow JSONTODATA

## Aperçu

L'application de workflow **JSONTODATA** vous permet d'analyser (« parse ») le contenu JSON dans des données de processus.&#x20;

## Mode de fonctionnement

* L'application JSONTODATA nécessite le paramètre `JSON_CONTENT` ou le paramètre `JSON_CONTENT_FILE`; ceux-ci correspondent au JSON à analyser.<br>
* L'application supporte le langage de requête JSONPath (voir <https://github.com/json-path/JsonPath>), qui permet l'extraction de données spécifiques à partir du contenu JSON, similaire aux expressions XPath en XML.<br>
* Des logs d'application sont disponibles. Ceux-ci peuvent être spécifiés en définissant la valeur du paramètre `JsonToDatalLogLevel` dans le fichier `web.config` sur `0` pour désactiver la journalisation, `1` pour les logs d'erreur, `2` pour des logs d'informations ou `3` pour les logs de débogage; la valeur par défaut est `0`.<br>

## Paramètres

| Paramètre           | Type | Direction | Description                                 |
| ------------------- | ---- | --------- | ------------------------------------------- |
| `JSON_CONTENT`      | TEXT | IN        | Requête à exécuter                          |
| `JSON_CONTENT_FILE` | FILE | IN        | Requête à exécuter, stockée dans un fichier |

## Mappage des paramètres

### Utilisation de noms de paramètres simples

L'application supporte les paramètres OUT personnalisés pour mapper un contenu JSON simple.

📌 **Exemple**

```
{
    "person": {
        "address": {
            "street": "160 Guy Street",
            "zipcode": "J4G 1U4"
        },
        "age": 30,
        "name": "John"
    }
}
```

Les paramètres suivants vous permettent de mapper le contenu JSON à différentes données de processus :

| Paramètre                | Type | Direction | Récupérer la valeur dans une donnée | Résultat         |
| ------------------------ | ---- | --------- | ----------------------------------- | ---------------- |
| `person.address.street`  | Text | OUT       | `DATA_STREET`                       | `160 Guy Street` |
| `person.address.zipcode` | Text | OUT       | `DATA_ZIPCODE`                      | `J4G 1U4`        |
| `person.age`             | Text | OUT       | `DATA_AGE`                          | `30`             |
| `person.name`            | Text | OUT       | `DATA_NAME`                         | `John`           |

### Utilisation du langage de requête JSONPath

L'application supporte le langage de requête JSONPath, similaire aux expressions XPath en XML. Ce langage vous permet de récupérer des données spécifiques à partir d'un JSON. Voir <https://github.com/json-path/JsonPath> pour plus d'informations sur la syntaxe JSONPath.

📌 **Exemple**

```
{
    "person": {
      "name": "Elizabeth",
      "age": 85,
      "dob": "1937-09-23T00:00:00Z",
      "children": [
        {
          "name": "Charles",
          "age": 60,
          "children": [
            {
              "name": "Nathalie",
              "children": [
                {
                  "name": "George",
                  "age": 8
                },
                {
                  "name": "Charlotte",
                  "age": 10
                },
                {
                  "name": "Jefferson",
                  "age": 7
                }
              ]
            },
            {
              "name": "Harry"
            }
          ]
        },
        {
          "name": "Bob",
          "age": 57,
          "children": [
            {
              "name": "John"
            },
            {
              "name": "Mark"
            }
          ]
        }
      ]
    }
}
```

Dans l'exemple ci-dessus, nous voulons obtenir les noms des petits-enfants de Charles âgés de plus de sept ans, et nous voulons également que ces noms soient séparés par un `|` (à l'aide du paramètre IN `APP_JSONPATH_DELIMITER`). En même temps, nous allons récupérer l'âge et la date de naissance d'Elizabeth. Pour obtenir ces informations, les paramètres suivants doivent être définis :

| Paramètre                | Type     | Direction | Valeur IN                                                                         | Valeur OUT                                                   |
| ------------------------ | -------- | --------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| `APP_JSONPATH_DELIMITER` | Text     | IN        | `\|`                                                                              |                                                              |
| `PARAM1__JSONPATH`       | Text     | INOUT     | `person.children[?(@.name == 'Charles')].children[*].children[?(@.age > 7)].name` | donnée `DATA1_VALUE` (la valeur sera : `George\|Charlotte`)  |
| `AGE__JSONPATH`          | Text     | IN        | `$.person.age`                                                                    |                                                              |
| `AGE`                    | Numeric  | OUT       |                                                                                   | donnée `AGE_VALUE` (la valeur sera : `85`)                   |
| `DOB__JSONPATH`          | Text     | IN        | `$.person.dob`                                                                    |                                                              |
| `DOB`                    | DateTime | OUT       |                                                                                   | donnée `DOB_VALUE` (la valeur sera : `1937-09-23T00:00:00Z`) |

{% hint style="warning" %}

* Dans le nom du paramètre `PARAM1__JSONPATH`, le nom de `PARAM1` n'est pas pertinent, mais il doit être suivi du suffixe `__JSONPATH` (**deux** traits de soulignement sont utilisés dans le suffixe).<br>
* Pour récupérer une valeur dans une donnée de type **Text** , vous pouvez utiliser un seul paramètre en INOUT (par exemple, le paramètre `PARAM1__JSONPATH` comme ci-dessus).<br>
* Pour récupérer une valeur dans une donnée de type **Numeric** ou **DateTime**, vous **devez** utiliser des paramètres distincts : un paramètre IN de type Text pour la requête JSONPath et un paramètre OUT pour associer à la donnée en Numeric ou DateTime. Les deux paramètres doivent partager le même préfixe de nom (par exemple, les paramètres `AGE__JSONPATH` et `AGE` comme ci-dessus).<br>
* La valeur par défaut de `APP_JSONPATH_DELIMITER` est une virgule (`,`) lorsque ce paramètre n'est pas défini.
  {% endhint %}
