【发布时间】:2021-04-22 06:38:29
【问题描述】:
我有这个 json
{
"objectEntries": [
{
"objectType": {
"name": "Test"
},
"attributes": [
{
"id": 16,
"objectTypeAttributeId": 8,
"objectAttributeValues": [
{
"referencedObject": {
"id": 17,
"label": "TestTest",
"attributes": [
{
"id": 20,
"objectTypeAttributeId": 11,
"objectAttributeValues": [
{
"value": "bli"
}
],
"objectId": 12
},
{
"id": 21,
"objectTypeAttributeId": 13,
"objectAttributeValues": [
{
"value": "blo"
}
],
"objectId": 14
},
{
"id": 22,
"objectTypeAttributeId": 15,
"objectAttributeValues": [
{
"referencedObject": {
"id": 30,
"label": "TestTest",
"attributes": [
{
"id": 35,
"objectTypeAttributeId": 36,
"objectAttributeValues": [
{
"value": "bli"
}
],
"objectId": 37
},
{
"id": 38,
"objectTypeAttributeId": 39,
"objectAttributeValues": [
{
"value": "blo"
}
],
"objectId": 40
}
]
}
}
],
"objectId": 16
}
]
}
}
]
},
{
"id": 16,
"objectTypeAttributeId": 8,
"objectAttributeValues": [
{
"referencedObject": {
"id": 17,
"label": "TestTest",
"attributes": [
{
"id": 20,
"objectTypeAttributeId": 11,
"objectAttributeValues": [
{
"value": "bli"
}
],
"objectId": 12
},
{
"id": 21,
"objectTypeAttributeId": 13,
"objectAttributeValues": [
{
"value": "blo"
}
],
"objectId": 14
},
{
"id": 22,
"objectTypeAttributeId": 15,
"objectAttributeValues": [
{
"referencedObject": {
"id": 30,
"label": "TestTest",
"attributes": [
{
"id": 35,
"objectTypeAttributeId": 36,
"objectAttributeValues": [
{
"value": "xxx"
}
],
"objectId": 37
},
{
"id": 38,
"objectTypeAttributeId": 39,
"objectAttributeValues": [
{
"value": "yyy"
}
],
"objectId": 40
}
]
}
}
],
"objectId": 16
}
]
}
}
]
}
]
}
]
}
我想要这个结果。
{
"name": "Test",
"attribute36": "bli",
"attribute39": "blo"
}
{
"name": "Test",
"attribute36": "xxx",
"attribute39": "yyy"
}
但我得到的是这个
{
"name": "Test",
"attribute36": "bli",
"attribute39": "blo"
}
{
"name": "Test",
"attribute36": "bli",
"attribute39": "yyy"
}
{
"name": "Test",
"attribute36": "xxx",
"attribute39": "blo"
}
{
"name": "Test",
"attribute36": "xxx",
"attribute39": "yyy"
}
我想出的 jq 查询
jq '.objectEntries[] | {"name": .objectType.name, "attribute36": .attributes | .[] | select(.objectTypeAttributeId==8) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==15) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==36) | .objectAttributeValues | .[] | .value, "attribute39": .attributes | .[] | select(.objectTypeAttributeId==8) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==15) | .objectAttributeValues[].referencedObject.attributes | .[] | select(.objectTypeAttributeId==39) | .objectAttributeValues | .[] | .value}' stackoverflow.json
你也可以在 jqplay https://jqplay.org/s/NjqEy7wvQE看到这个问题
目标是将不同 jsonpath 深度上的某些字段提取到一个新的平面 json 对象中,每个顶层 json 对象,其中顶层是 objectEntries[] 下的对象
【问题讨论】:
-
发布您的要求,您要达到什么目的?即你想要的结果背后的逻辑
-
为什么只有 36、39?
-
对象构造逻辑还不清楚
-
name、attribute36、attribute39 是我对 objectEntries 中的对象数组感兴趣的值。我需要提取它们才能从这 3 个键:值对中创建一个 csv。 attributeId 是唯一的,我在嵌套对象中通过 attributeId 选择我感兴趣的值
标签: jq