解析时json,命令行工具jshon
将数字转换为科学计数法,有时试图将它们圆整。
为了避免这些问题,我希望 jshon 将这些数字视为字符串。为此,我发现需要在 json 文件中的所有数字周围加上引号。经过一些不成功的谷歌搜索后,我尝试编写一个 sed 命令来引用数字,但我发现它非常不安全,并且已经遇到了很多问题:
sed -r 's/(" ?[:,] ?)"?([0-9]+(\.[0-9]+)?)"?([,}]|$)/\1"\2"\4/g' $file
我想知道有没有稳定的解析器这可以给我想要的结果。我没有在问题中包含示例 json 文件,因为我需要此代码来执行一些小风险操作,并且我将从随机网站解析 json。
答案1
这是一个简单的 python3 脚本,您可以在 shell 中将其作为过滤器调用。将下面的脚本保存在名为 的文件中filter.py
,使其可执行,然后使用./filter.py <$file
由于我不知道 JSON 文件的结构,因此我假设每行一个 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"}