Rileva file JSON non validi nella struttura di directory


4

Voglio fallire una build se l'albero delle directory contiene un file JSON che non è valido secondo il jsonlintpacchetto da NPM .

Ho pensato che sarebbe stato facile come correre:

find . -name \*.json | xargs jsonlint -q

Sapevo di avere un documento JSON mal formato sul disco, e questo non lo raccoglie.

Ulteriori indagini dimostrano che il findcomando funziona come previsto, tuttavia l' jsonlinteseguibile viene chiamato solo una volta (e il primo file JSON è corretto.)

C'è un modo migliore per farlo, o c'è qualcosa che devo imparare xargsqui?

Sto eseguendo Ubuntu 13.10 Server e posso installare pacchetti se necessario.

Risposte:


5

Sembra che jsonlintnon sia possibile gestire più file:

$ jsonlint -h

Usage: jsonlint [file] [options]

file     file to parse; otherwise uses stdin

Nota che dice sempre file , mai file . Quando esegui un comando e reindirizza il suo output xargscome hai fatto, xargssemplicemente concatena tutto l'output del comando e lo passa come input a qualsiasi cosa tu gli abbia detto di eseguire. Per esempio:

$ printf "foo\nbar\nbaz\n"
foo
bar
baz
$ printf "foo\nbar\nbaz\n" | xargs echo
foo bar baz

Ciò dimostra che il comando eseguito da xargsera

echo foo bar baz

Nel caso di jsonlint, quello che vuoi fare non è jsonlint -q foo bar bazma

$ jsonlint -q foo
$ jsonlint -q bar
$ jsonlint -q baz

Il modo più semplice per farlo è usare findcome suggerito da @ fede.evol:

$ find . -name \*.json -exec xargs jsonlint -q {} \;

Per farlo è xargsnecessario utilizzare la -Ibandiera:

   -I replace-str
          Replace occurrences of replace-str in the initial-arguments with
          names read from standard input.  Also, unquoted  blanks  do  not
          terminate  input  items;  instead  the  separator is the newline
          character.  Implies -x and -L 1.

Per esempio:

$ find . -name \*.json  | xargs -I {} jsonlint -q {}

Oppure, per gestire in modo sicuro nomi strani (che contengono ad esempio newline):

$ find . -name \*.json -print0  | xargs -0I {} jsonlint -q '{}'

Su Ubuntu, quando tu sudo apt-get install jsonlint, il comando è jsonlint-phpe non hai bisogno del flag -q. È possibile utilizzare find . -name \*.json | xargs -I {} jsonlint-php {}.
edelans

1

Utilizzare l'opzione "-exec" per eseguire su ogni ricorrenza di ricerca. Il file di ricorrenza viene passato come {} e usa \; per finire il comando.

Quindi qualcosa come:

find . -name \*.json -exec jsonlint {} \;

Sull'output potresti fare un grep inverso di ": ok". qualcosa di simile a:

find . -name "*.txt" -exec jsonlint -v {} \; 2>&1 | grep -q -v  ": ok"

Questo restituirà falso se ce n'è uno non ok o vero se c'è. Il 2> & 1 è brutto ma gli errori sono scritti su stderr almeno sulla mia versione jsonlint


1

Le risposte attuali a questa domanda sono incomplete poiché i comandi suggeriti non stamperanno il nome del file non valido. Inoltre, jsonlint è uno strumento estremamente lento.

Ecco un'alternativa molto più veloce che non dovrebbe richiedere installazioni aggiuntive sulla maggior parte dei sistemi:

find . -name \*.json -exec echo {} \; -exec python -mjson.tool "{}" \; 2>&1 | grep "No JSON" -B 1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.