json 为什么使用jq更新数组时显示错误

bxgwgixi  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(135)

我的JSON文件(temp.json):

  1. {
  2. "first": {
  3. "second": [
  4. {
  5. "third": [
  6. "1000",
  7. "1001"
  8. ],
  9. "fourth": "Don'tWantToChange"
  10. },
  11. {
  12. "third": [
  13. "1000",
  14. "1001",
  15. "1002"
  16. ],
  17. "fourth": "WantToChange"
  18. }
  19. ]
  20. }
  21. }

我想从数组中选择一个项目并更新如下

  1. {
  2. "first": {
  3. "second": [
  4. {
  5. "third": [
  6. "1000",
  7. "1001"
  8. ],
  9. "fourth": "Don'tWantToChange"
  10. },
  11. {
  12. "third": [
  13. "1000",
  14. "1001",
  15. "1002"
  16. ],
  17. "fourth": "changed"
  18. }
  19. ]
  20. }
  21. }

这是我的代码:

  1. jq '(.first | .second[] | select(.third | index("1002")) | .fourth) |= "changed"' temp.json

它的作品在网上JQPlayground完美
但在终端中,它显示错误:

  1. jq: error (at temp.json:13): Invalid path expression near attempt to access element "fourth" of {"third":["1000","1001","1...

我哪里做错了?

r9f1avp5

r9f1avp51#

jq-1.5-1-a5 b5 cbe(与Debain和Ubuntu的某些版本一起打包)在从管道select过滤器推断类型时存在问题。在这种情况下,如果没有找到值,index提供null,如果找到了,则提供一个数字(实际索引),但select需要在其主体中提供一个布尔结果。
解决办法:将body用括号括起来,并将其结果与null进行比较以获得布尔值:

  1. (.first | .second[] | select((.third | index("1002")) != null) | .fourth) = "changed"

解决方案:升级到jq 1.6。它于2018年发布。
注意:对于给定的示例,两个版本都不需要更新操作符|=。只需使用=来分配静态值。

相关问题