シェルでJSON番号を文字列に変換する

シェルでJSON番号を文字列に変換する

解析するときJSONjshon、数値を科学的表記法に変換するコマンドラインツールです。それらを丸める

これらの問題を避けるために、jshonはこれらの数字を文字列として扱いたいと思います。これを行うには、jsonファイルのすべての数字の周りに引用符を入れる必要があることがわかりました。私はインターネット検索に失敗した後に数字を引用するためにsedコマンドを書こうとしましたが、それは非常に安全ではなく、多くの問題に遭遇しました。

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

安定した場所があるかどうか知りたいです。パーサーこれは私に望む結果を与えます。小さな危険な作業を行うには、このコードが必要であり、任意のWebサイトでjsonを解析するため、質問にサンプルjsonファイルを含めませんでした。

答え1

これはシェルからフィルタとして呼び出すことができる単純なpython3スクリプトです。以下のスクリプトをというファイルに保存し、filter.py実行可能にしてから使用してください。./filter.py <$file

JSONファイルの構造がわからないので、1行に1つのjson文字列があるとします。調整が必要な場合はお知らせください。

#!/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)

これは私のテストの結果です。

$ 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"}

関連情報