如何在复杂的 JSON 对象中只保留一组指定的字段?

How to retain only a set of specified fields in a complex JSON object?

总结:

我需要使用 JQ 一次通过 从复杂的 JSON 对象 中过滤 PII 数据。我不在解构 and/or 多通道的脚本中。我想保留非 PII 属性而不是删除 PII 属性,因为如果后端添加新的 PII 属性 并且不让我知道,我想避免 PII 泄漏暴露。

在简单的情况下,我可以很容易地从输入对象中“重建”所需的 JSON 对象,如下所示:

{
 "data": {
   "id": "123",
   "pii": "sensitve"
 }
 "return-code": 200
}

jq '{data: {id: .data.id }, return-code: .return-code}'

将数组添加到组合中后,我看不出如何使用这种方法来解决这个问题。

复杂对象的简化示例

输入:

{
  "customers": [
    {
      "id": "00000000001",
      "dateOfBirth": "sensitive DOB",
      "preferences": [
        {
          "preference-id": "0001",
          "pii-value": "senstive value 1"
        },
        {
          "preference-id": "0002",
          "pii-value": "senstive value 2"
        }
      ]
    },
    {
      "id": "00000000002",
      "dateOfBirth": "sensitive DOB",
      "preferences": [
        {
          "preference-id": "0003",
          "pii-value": "senstive value 3"
        },
        {
          "preference-id": "0004",
          "pii-value": "senstive value 4"
        }
      ]
    }
  ]
}

期望输出:

{
  "customers": [
    {
      "id": "00000000001",
      "preferences": [
        {
          "preference-id": "0001"
        },
        {
          "preference-id": "0002"
        }
      ]
    },
    {
      "id": "00000000002",
      "preferences": [
        {
          "preference-id": "0003"
        },
        {
          "preference-id": "0004"
        }
      ]
    }
  ]
}

尝试使用数组的方法:

jq '{ customers: [ { id: .customers[].id, preferences: [ .customers[].preferences ] } ]}'

结果开始汇总不同客户的排列组合

{
  "customers": [
    {
      "id": "00000000001",
      "preferences": [
        [
          {
            "preference-id": "0001",
            "pii-value": "senstive value 1"
          },
          {
            "preference-id": "0002",
            "pii-value": "senstive value 2"
          }
        ],
        [
          {
            "preference-id": "0003",
            "pii-value": "senstive value 3"
          },
          {
            "preference-id": "0004",
            "pii-value": "senstive value 4"
          }
        ]
      ]
    },
    {
      "id": "00000000002",
      "preferences": [
        [
          {
            "preference-id": "0001",
            "pii-value": "senstive value 1"
          },
          {
            "preference-id": "0002",
            "pii-value": "senstive value 2"
          }
        ],
        [
          {
            "preference-id": "0003",
            "pii-value": "senstive value 3"
          },
          {
            "preference-id": "0004",
            "pii-value": "senstive value 4"
          }
        ]
      ]
    }
  ]
}

我真的认为这种方法根本行不通,而且我对其他方法一筹莫展。这是一个简化的示例,实际的 JSON 相当大,有许多嵌套级别的数组。

对我可能研究的方法有什么建议吗?

使用用户函数 从 JSON 中选择 特定路径:

def pick(paths):
  . as $in
  | reduce path(paths) as $path (null;
    setpath($path; $in | getpath($path))
  );
pick(.customers[] | .id, .preferences[]."preference-id")

Online demo