2015-05-19 15 views
19

Stiamo costruendo un sito Web utilizzando la libreria Pentaho CTools, che ha un editor grafico del dashboard che scrive i file in formato JSON per parte del dashboard.Come ordinare un file JSON con chiavi e valori di quei tasti in jq

Mi piacerebbe applicare una trasformazione a questi file prima del check-in per git per ordinarli per chiave e poi per il valore di alcuni tasti. Lo scopo è rendere le differenze più semplici, poiché l'editor ha l'abitudine di riorganizzare tutti i campi JSON.

Ad esempio, potremmo avere qualcosa di simile:

{ 
    "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": "[]" 
      }, 
... 

Siamo in grado di jq --sort-keys (http://stedolan.github.io/jq/) per ordinare tutte le chiavi, ma sto lottando per trovare il modo di utilizzare la funzione sort_by per poi sorta alcuni elementi specifici per il valore di alcuni tasti (così, nell'esempio di cui sopra, l'ordinamento per properties.name per esempio. Tutte le idee?

risposta

34

Ok con qualche assistenza sul canale IRC che ho trovato una risposta.

In sostanza, sembra che questo:

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

in modo da fare il Select dell'oggetto destra, camminando in array, se necessario, e poi sort_by richiede solo un singolo valore (cercavo sort_by(.components.rows.id) che non).

il | = invece del | passa i valori lungo anziché rimuoverli.

+0

Nota: per chiunque voglia effettivamente farlo con un file '.cdfde' di CTools, l'ordinamento delle chiavi sembra essere corretto, così come l'ordinamento degli elementi' name' all'interno dell'array delle proprietà, ma l'ordinamento del 'componente'' rows' di 'id' è un no-no, rompe le cose. Quindi non farlo ... – karlos

Problemi correlati