/ / Comment appliquer une fonction à toutes les chaînes de la structure de l'enregistrement de manière récursive en utilisant jq - json, recursion, jq

Comment appliquer une fonction à toutes les chaînes de la structure de l'enregistrement de manière récursive en utilisant jq - json, recursion, jq

Est-il possible d'appliquer une transformation récursive à un enregistrement pour retourner le même enregistrement, mais en ayant tous string valeurs mappées?

Par exemple:

{"x":"1", "a": {"b": 2, "c": ["a"]}, "d": {"e": "z"}}

avec un mappage "add prime" appliqué:

{"x":"1"", "a": {"b": 2, "c": ["a""]}, "d": {"e": "z""}}

J'ai essayé d'utiliser une combinaison de recurse, map, string et select avec peu de chance. Des idées?

Réponses:

3 pour la réponse № 1

Vous pouvez également le faire facilement avec l'opérateur recurse:

jq "(.. | strings) += """"

.. génère un flux en itérant récursivement à travers chaque élément de l'entrée, strings filtre le flux pour ceux qui sont des chaînes, += ajoute l'élément de droite à chaque élément du flux de gauche et """ est un littéral contenant le "premier" que vous recherchez.


2 pour la réponse № 2

Oui utiliser walk/1. Il est expliqué dans le manuel jq.

Si votre jq ne l'a pas défini, voici sa définition à partir de builtin.jq:

# Apply f to composite entities recursively, and to atoms
def walk(f):
. as $in
| if type == "object" then
reduce keys[] as $key
( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
elif type == "array" then map( walk(f) ) | f
else f
end;

0 pour la réponse № 3

Voici une solution qui utilise chemins / 1 pour identifier les valeurs de chaîne et les mettre à jour avec réduire, setpath et getpath

reduce paths(type == "string") as $p (
.
; setpath($p; getpath($p) + """)
)