web-dev-qa-db-fra.com

Comment trier un fichier json par clés et valeurs de ces clés dans jq

Nous construisons un site Web à l'aide de la bibliothèque Pentaho CTools, qui dispose d'un éditeur de tableau de bord graphique qui écrit des fichiers au format JSON pour une partie du tableau de bord.

Je voudrais appliquer une transformation à ces fichiers avant l'enregistrement à git afin de les trier par clé puis par valeur de certaines clés. Le but est de faciliter les différences, car l'éditeur a l'habitude de réorganiser tous les champs json.

Par exemple, nous pourrions avoir quelque chose comme ceci:

{
  "components": {
    "rows": [
      {
        "id": "CHARTS",
        "name": "Charts",
        "parent": "UnIqEiD",
        "properties": [
          {
            "name": "Group",
            "type": "Label",
            "value": "Charts"
          }
        ],
        "type": "Label",
        "typeDesc": "<i>Group</i>"
      },
      {
        "id": "kjalajsdjf",
        "meta_cdwSupport": "true",
        "parent": "CHARTS",
        "properties": [
          {
            "name": "name",
            "type": "Id",
            "value": "Value1"
          },
          {
            "name": "title",
            "type": "String",
            "value": "Value2"
          },
          {
            "name": "listeners",
            "type": "Listeners",
            "value": "[]"
          },
...

Nous pouvons jq --sort-keys ( http://stedolan.github.io/jq/ ) pour trier toutes les clés, mais j'ai du mal à trouver comment utiliser le sort_by fonction pour trier ensuite certains éléments spécifiques par la valeur de certaines clés (donc, dans l'exemple ci-dessus, trier par properties.name par exemple. Des idées?

32
karlos

Ok avec de l'aide sur le canal IRC J'ai trouvé une réponse.

Fondamentalement, cela ressemble à ceci:

> jq '.components.rows|=sort_by(.id)|.components.rows[].properties|=sort_by(.name)' file.json > out.json

Donc, vous faites la sélection du bon objet, en marchant dans les tableaux si nécessaire, puis sort_by prend juste une seule valeur (j'essayais sort_by(.components.rows.id) qui a échoué).

le | = au lieu du | transmet les valeurs au lieu de les supprimer.

48
karlos