如果子对象存在于使用 jq 的对象数组中,我该如何修改它?

How do I modify a child object if it exists in array of objects using jq?

我正在尝试使用 jq 在 API 请求或响应的各个级别修改 json 数据,以启用对 API 版本控制的支持。

这是我的(简化的)测试 JSON:

[
  {
    "note": null,
    "patient_id": 1,
    "phenotypes": [
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 1,
        "person_id": 1
      },
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 1,
        "person_id": 1
      }
    ]
  },
  {
    "note": null,
    "patient_id": 2
  },
  {
    "note": null,
    "patient_id": 3,
    "phenotypes": [
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 3,
        "person_id": 3
      },
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 3,
        "person_id": 3
      }
    ]
  }
]

我有一组对象。每个对象可能有 "phenotypes",我需要修改其内容,并从顶级对象中删除 "note"

目前我的jq如下:

[ map(del(.note, .age)) | .[] | select(.phenotypes != null) | .phenotypes |= map(del(.person_id)) ]

这几乎可行,但由于 select(.phenotypes != null),数组中的第二个对象在过滤后再也没有返回。

我也尝试过使用 if-then-else (end),但是我不能让它不出错,而且我找不到任何表明它可以用于进一步表达的示例或文档。

我的预期输出如下:

[
  {
    "patient_id": 1,
    "phenotypes": [
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 1
      },
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 1
      }
    ]
  },
  {
    "patient_id": 2
  },
  {
    "patient_id": 3,
    "phenotypes": [
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 3
      },
      {
        "name": "Breast carcinoma",
        "observation": "present",
        "patient_id": 3
      }
    ]
  }
]

note 已从根中删除。 person_id 已从 phenotypes 中删除。

这对我有用:

map(del(.note, .age)) |
map( 
    if .phenotypes then 
        (.phenotypes |= map(del(.person_id)))
    else
        .
    end 
)

Working example