如何在复杂的 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")
总结:
我需要使用 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")