Converte números json em strings no shell

3

Ao analisar json , a ferramenta de linha de comando jshon converte números em notação científica e, às vezes, tenta arredondá-los .

Para evitar esses problemas, quero que o jshon considere esses números como strings. Para isso, descobri que preciso colocar aspas em volta de todos os números no arquivo json. Depois de alguns googling sem sucesso, eu tentei escrever um comando sed para citar os números, mas achei muito inseguro e já tive muitos problemas:

 sed -r 's/(" ?[:,] ?)"?([0-9]+(\.[0-9]+)?)"?([,}]|$)/""/g' $file

Eu gostaria de saber se existe algum parser estável que possa me dar o resultado desejado. Eu não estou incluindo um arquivo json de exemplo na pergunta, porque eu preciso deste código para algumas operações pouco arriscadas, e eu vou estar analisando json de sites aleatórios.

    
por Teresa e Junior 14.07.2014 / 02:26

1 resposta

2

Aqui está um script python3 simples que você pode chamar como um filtro em um shell. Salve o script abaixo em um arquivo chamado algo como filter.py , torne executável e chame com ./filter.py <$file

Como não conheço a estrutura do seu arquivo JSON, assumo uma string json por linha. Deixe-me saber se você precisa mexer.

#!/usr/bin/python3
import json
import sys
for line in sys.stdin:
   try:
       print(json.dumps(json.loads(line, parse_float=str)))
   except (ValueError, TypeError):
       pass  # skip lines not parsable by json
       # print(line)  # uncomment to print non-json lines as-is
   # uncomment to ignore all other errors
   # except Exception:
   #    pass
exit(0)

Aqui está a saída dos meus testes:

$ cat $file
{"a":200.12345678999999, "b":0.00001875}
{"a":200.1234567893029999, "b":0.03091875}
$ ./test.py <$file
{"a": "200.12345678999999", "b": "0.00001875"}
{"a": "200.1234567893029999", "b": "0.03091875"}
    
por 14.07.2014 / 10:03