Identifique arquivos .json com matrizes vazias?

1

Eu tenho uma pasta com vários arquivos .json. Existem certos arquivos com matrizes vazias, arquivo de exemplo:

{
"WarehouseActivity": []
}

O arquivo não possui outros dados além do mostrado acima.

Eu preciso identificar esses arquivos e movê-los para uma pasta de erros. Qualquer sugestão sobre como fazer isso seria ótimo.

Obrigado Kavin

    
por Kavin Palaniswamy 04.05.2018 / 14:02

2 respostas

2

Jq seria a ferramenta certa para processar / analisar dados JSON :

for f in *.json; do
    if jq -e 'keys_unsorted as $keys
              | ($keys | length == 1) 
                and .[($keys[0])] == []' "$f" > /dev/null; then
        mv "$f" error_dir/
    fi
done
    
por 04.05.2018 / 14:33
2
mkdir -p error_folder &&
for json in ./*.json; do
    if jq -e '..|select(type == "array" and length == 0)' <"$json" >/dev/null
    then
        mv "$json" error_folder/
    fi
done

Esta é mais ou menos a mesma abordagem que Roman tomou em sua resposta , mas usa um% diferente de co_de expressão%.

A expressão jq irá recriar a estrutura JSON completa e selecionar todos os bits dela que sejam matrizes de comprimento zero (em qualquer lugar, em qualquer profundidade).

Se o ..|select(type == "array" and length == 0) for bem-sucedido, então select() sairá com um status de saída zero (êxito), o que significa que o documento JSON contém um array vazio em algum lugar (ou o arquivo está totalmente vazio). Isso aciona a movimentação do documento para jq no script.

Nos comentários abaixo, fica claro que o usuário está interessado apenas na matriz error_folder .

Meu código com uma expressão WarehouseActivity modificada:

mkdir -p error_folder &&
for json in ./*.json; do
    if jq -e '..|select(type == "object" and has("WarehouseActivity") and (.WarehouseActivity|length) == 0)' <"$json" >/dev/null
    then
        mv "$json" error_folder/
    fi
done
    
por 04.05.2018 / 15:00