Je veux récupérer la paire clé / valeur de l'objet tableau json. J'essaie de construire une clause where dynamique avec l'entrée. Si la valeur de la clé est la même dans le tableau, je veux l'utiliser avec l'opérateur "IN" sinon je veux utiliser "AND". Expliquer les deux scénarios à l'aide de deux exemples
Input1:
**"Where id = '123' and name = 'abc'**
]
Résultat attendu:
"values": [ { "id": "123" }, { "name": "abc" }
Input2:
**"Where id in ('123','455')"**
]
Résultat attendu:
"values": [ { "id": "123" }, { "id": "455" }
Merci d'avance
3 Réponses :
Cela devrait vous permettre de progresser sur la bonne voie.
%dw 2.0 import * from dw::core::Arrays output application/json var values = [ { "id": "123" }, { "id": "abc" } ] --- if ( (values countBy ($.id != null)) > 1 ) "in" else if ( (values countBy ($.id != null)) == 1 ) "and" else "idk"
Vérifiez si toutes les clés sont identiques pour différencier les cas.
Vous pouvez utiliser la fonction joinBy avec "','"
ou "et"
pour séparer les valeurs.
%dw 2.0 import * from dw::core::Arrays output application/json var firstKey = keysOf(payload.values[0])[0] var sameKeys = payload.values every ((item) -> keysOf(item)[0] == firstKey) --- if (sameKeys) "Where " ++ firstKey ++ " in ('" ++ (payload.values[firstKey] joinBy "','") ++ "')" else "Where " ++ (payload.values map ((item, index) -> keysOf(item)[0] ++ " = '" ++ valuesOf(item)[0] ++ "'") joinBy " and ")
keysOf est introduit dans dataweave 2.3 je suppose. J'utilise une version précédente. Une suggestion sur ce que je pourrais le remplacer? J'ai essayé avec keySet mais même cela ne semble pas fonctionner.
J'ai mis à jour l'approche de Christian en utilisant keySet et publié en tant que réponse ci-dessous. HTH ..
L'approche de Christian, utilisant le jeu de clés
%dw 2.0 import * from dw::core::Objects import * from dw::core::Arrays output application/json var firstKey = keySet(payload.values[0])[0] var sameKeys = payload.values every ((item) -> keySet(item)[0] == firstKey) --- if (sameKeys) "Where " ++ firstKey ++ " in ('" ++ (payload.values[firstKey] joinBy "','") ++ "')" else "Where " ++ (payload.values map ((item, index) -> keysOf(item)[0] ++ " = '" ++ valuesOf(item)[0] ++ "'") joinBy " and ")