在 shell 中将 json 数字转换为字符串

在 shell 中将 json 数字转换为字符串

解析时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"}

相关内容