使用 jq filter 或 jq play 将所有键值对组合成一个
Combining all key value pairs in one using jq filter or jq play
我想使用 jq 过滤器JSON 转换数据
Json数据:
{
"main": [
{
"firstKey": "ABCD",
"id": "12345",
"data": [
{
"name": "first_id",
"value": "first_id_value"
},
{
"name": "second_id",
"value": "second_id_value"
},
{
"name": "third_id",
"value": "third_id_value"
}
]
}
]
}
预期输出:
{
"firstKey": "ABCD",
"id": "12345",
"data.name.first_id": "first_id_value",
"data.name.second_id": "second_id_value",
"data.name.third_id": "third_id_value"
}
经过多次试验和错误,我使用以下过滤器表达式接近预期输出
[.main[]|{"firstKey", "id"},foreach .data[] as $item (0; "data.name.\($item.name)" as $a|$item.value as $b| {($a): $b})][]
使用 foreach 作为 “数据”下的对象是动态的。对象的数量可以不同。
上述表达式的输出是:
{
"firstKey": "ABCD",
"id": "12345"
}
{
"data.name.first_id": "first_id_value"
}
{
"data.name.second_id": "second_id_value"
}
{
"data.name.third_id": "third_id_value"
}
但我希望 数据对象与 'firstKey' 和 'id'.
位于相同的大括号 下
任何建议都会有所帮助。
由于你的结构是如此严格,你可以作弊并使用内置的 from_entries
,它采用 {key, value}
对的列表并构造一个对象:
.main[] |
{firstKey, id} +
(.data | map({key: "data.name.\(.name)", value}) |
from_entries)
我想使用 jq 过滤器JSON 转换数据
Json数据:
{
"main": [
{
"firstKey": "ABCD",
"id": "12345",
"data": [
{
"name": "first_id",
"value": "first_id_value"
},
{
"name": "second_id",
"value": "second_id_value"
},
{
"name": "third_id",
"value": "third_id_value"
}
]
}
]
}
预期输出:
{
"firstKey": "ABCD",
"id": "12345",
"data.name.first_id": "first_id_value",
"data.name.second_id": "second_id_value",
"data.name.third_id": "third_id_value"
}
经过多次试验和错误,我使用以下过滤器表达式接近预期输出
[.main[]|{"firstKey", "id"},foreach .data[] as $item (0; "data.name.\($item.name)" as $a|$item.value as $b| {($a): $b})][]
使用 foreach 作为 “数据”下的对象是动态的。对象的数量可以不同。 上述表达式的输出是:
{
"firstKey": "ABCD",
"id": "12345"
}
{
"data.name.first_id": "first_id_value"
}
{
"data.name.second_id": "second_id_value"
}
{
"data.name.third_id": "third_id_value"
}
但我希望 数据对象与 'firstKey' 和 'id'.
位于相同的大括号 下任何建议都会有所帮助。
由于你的结构是如此严格,你可以作弊并使用内置的 from_entries
,它采用 {key, value}
对的列表并构造一个对象:
.main[] |
{firstKey, id} +
(.data | map({key: "data.name.\(.name)", value}) |
from_entries)