使用 jq 将 json 的值从 int 转换为 string

Convert value of json from int to string using jq

给出的 json 看起来像:

[{"id":1,"firstName":"firstName1","lastName":"lastName1"},
{"id":2,"firstName":"firstName2","lastName":"lastName2"},
{"id":3,"firstName":"firstName3","lastName":"lastName3"}]

将 id 值从 int 转换为字符串然后保存文件的最佳方法是什么?

我试过:

echo "$(jq -r '[.[] | .id = .id|tostring]' test.json)" > test.json

但这似乎将每个条目放入一个字符串中并添加反斜杠

[
  "{\"id\":1,\"firstName\":\"firstName1\",\"lastName\":\"lastName1\"}",
  "{\"id\":2,\"firstName\":\"firstName2\",\"lastName\":\"lastName2\"}",
  "{\"id\":3,\"firstName\":\"firstName3\",\"lastName\":\"lastName3\"}"
]

| 的优先级低于分配 (=)。表达式 .id = .id | tostring 被解释为 (.id = .id) | tostring.

分配确实改变了任何东西,可以删除。脚本变为 [ .[] | tostring ],解释输出(每个对象被序列化为 JSON 到一个字符串中)。

解决方案是使用括号强制执行所需的顺序。
命令是:

jq '[ .[] | .id = (.id | tostring) ]' test.json

不要使用进程扩展 ($(...)) 来编写 echo 命令行。它效率低下且不需要。

jq 的输出直接重定向到文件。使用与输入文件不同的文件(否则最终会破坏您的数据)。

jq '[ .[] | .id = (.id | tostring) ]' test.json > output.json