Mappages JSONPath pour le connecteur REST API générique
Découvrez comment utiliser efficacement les mappages JsonPath pour rationaliser l'extraction de données dans un connecteur REST API générique et ainsi améliorer l'intégration.
Mappages JSONPath pour le connecteur REST API générique
Découvrez comment utiliser efficacement les mappages JsonPath pour rationaliser l'extraction de données dans un connecteur REST API générique et ainsi améliorer l'intégration.
Le connecteur REST API générique permet de configurer les mappages d'attributs à l'aide du langage JSONPath.
Le tableau suivant présente les syntaxes JSONPath prises en charge et celles qui ne le sont pas. Compte tenu du grand nombre d'expressions JSONPath possibles, ce tableau n'est pas exhaustif. Il est donc probable que certaines syntaxes non prises en charge fonctionnent également.
Le principal problème est que JSONPath ne prend pas en charge les tableaux d'objets JSON renvoyés par ce biais.
Les correspondances JSONPath ont été testées avec cet exemple de JSON :
{
"id": "u-123",
"user": {
"name": "Ada Lovelace",
"email": "ada@example.com",
"first-name": "Ada",
"meta": {
"active": true,
"score": 42,
"nullField": null
}
},
"store": {
"book": "abc",
"bike": "xyz",
"nested": {
"price": 9.99,
"currency": "EUR"
}
},
"groups": ["Admin", "HR"],
"groupObjects": [
{ "name": "Admin", "id": 1, "enabled": true },
{ "name": "HR", "id": 2, "enabled": false }
],
"child": {
"id": "child-1",
"child": {
"id": "child-2"
}
},
"storeList": [
{ "id": "s1", "name": "Shop 1", "price": 10 },
{ "id": "s2", "name": "Shop 2", "price": 20 }
],
"emptyArray": [],
"emptyObject": {},
"weirdKeys": {
"ab": "dot-key",
"space key": "space-key",
"brackets[key]": "bracket-key"
}
}Syntaxe JSONPath prise en charge et non prise en charge
| Chemin JSON standard | Syntaxe utilisée dans le tableau de correspondance des connecteurs | Exemple de résultat | Notes | Statut |
|---|---|---|---|---|
$.id
|
id
|
"u-123"
|
propriété scalaire simple | Soutenu |
$.user.name
|
user.name
|
"Ada Lovelace"
|
Propriété imbriquée | Soutenu |
$.user.email
|
user.email
|
"ada@example.com"
|
Propriété imbriquée | Soutenu |
$.user['first-name']
|
user['first-name']
|
"Ada"
|
La notation par crochets fonctionne | Soutenu |
$.user.meta.active
|
user.meta.active
|
true
|
valeur booléenne | Soutenu |
$.user.meta.score
|
user.meta.score
|
42
|
Propriétés imbriquées multiples. Valeur numérique (correspondant à une chaîne de caractères ou à un nombre). | Soutenu |
$.store.nested.price
|
store.nested.price
|
9.99
|
Propriétés imbriquées multiples. Valeur décimale (correspondant à une chaîne de caractères ou à un nombre décimal). | Soutenu |
$.groups
|
groups
|
["Admin","HR"]
|
Tableau de chaînes de caractères (correspond à un attribut de chaîne à valeurs multiples) | Soutenu |
$.groupObjects[*].name
|
groupObjects[*].name
|
["Admin","HR"]
|
Pro vers un tableau de chaînes (association à un attribut de chaîne multivalué) | Soutenu |
$.storeList[?(@.id=='s1')].price
|
storeList[?(@.id=='s1')].price
|
[10]
|
Filtre de chaîne sans espaces | Soutenu |
$.storeList[?(@.price<30)].id
|
storeList[?(@.price<30)].id
|
["s1","s2"]
|
Filtre numérique (associer à un attribut de chaîne multivaluée) D'autres opérateurs de comparaison sont également pris en charge, tels que : == <= >= > < != |
Soutenu |
$.groupObjects[?(@.enabled==false)].name
|
groupObjects[?(@.enabled==false)].name
|
["HR"]
|
Filtre booléen (associer à un attribut de chaîne multivaluée) |
Soutenu |
$.groupObjects
|
groupObjects
|
[{"name":"Admin",...},{"name":"HR",...}]
|
Renvoie un tableau d'objets JSON | Non pris en charge |
$.groupObjects[*]
|
groupObjects[*]
|
[{"name":"Admin",...},{"name":"HR",...}]
|
Pro projection renvoie un tableau d'objets JSON | Non pris en charge |
$.storeList[?(@.price<30)]
|
storeList[?(@.price<30)]
|
[{"id":"s1",...},{"id":"s2",...}]
|
Le filtre renvoie un tableau d'objets JSON | Non pris en charge |
$.storeList[?(@.name=='Shop 1')].price
|
storeList[?(@.name=='Shop 1')].price
|
[10]
|
Échec du filtrage de chaînes littérales contenant un espace | Non pris en charge |
$..id
|
..id
|
[ "u-123", "child-1", "child-2", ... ]
|
Descente récursive | Non pris en charge |
$.store.*
|
store.*
|
["abc","xyz",{...}]
|
générique d'objet | Non pris en charge |
Mappages de sous-requêtes
La première partie du mappage des sous-requêtes est la sous-requête elle-même, suivie du point, puis du JSONPath proprement dit, de la même manière que dans le tableau des syntaxes JSONPath prises en charge.
Exemple de récupération des appartenances aux groupes des utilisateurs depuis Google
Sous-requête : groupes?userKey={id}
Dans la sous-requête, {id} est une variable dynamique qui, dans ce cas, pointe vers l'attribut id du jeu de résultats de la requête principale. JSONPath n'est pas pris en charge dans les sous-requêtes.
Mappage pour cette sous-requête, afin de récupérer les identifiants des groupes auxquels appartient un utilisateur :
groupes?userKey={id}.groups[*].id où le JSONPath réel est cette partie à la fin : groupes[*].id
Exemple de JSON de API Google Groups. Grâce à une sous-requête et à un mappage, nous pouvons extraire les identifiants des groupes à partir de cet ensemble de résultats.
{
"kind": "directory#groups",
"etag": "\"p7cdf8ab12e9\"",
"groups": [
{
"kind": "directory#group",
" id ": " 01abcde123456789 ",
"etag": "\"abc123etag\"",
"email": "engineering@efectebaselinedev.onmicrosoft.com",
"name": "Engineering Team",
"description": "Main engineering group",
"directMembersCount": "15",
"adminCreated": true,
"aliases": [
"eng@efectebaselinedev.onmicrosoft.com"
],
"nonEditableAliases": [
"engineering@group.calendar.google.com"
]
},
{
"kind": "directory#group",
" id ": " 02xyz987654321 ",
"etag": "\"xyz456etag\"",
"email": "support@efectebaselinedev.onmicrosoft.com",
"name": "Support",
"description": "Customer support group",
"directMembersCount": "8",
"adminCreated": true
}
],
"nextPageToken": "CgYIARAA"
}
Table of Contents