我有一些我想根據步行添加的 json。我擁有的json的一個簡單示例如下:
{
"valueSource": "memory",
"dataType": "Boolean",
"alarms": [
{
"setpointA": 1.0,
"name": "Alarm",
"priority": "Diagnostic",
"ackMode": "Auto",
}
],
"name": "Test Alarm",
"value": false,
"tagType": "AtomicTag"
}
我想向“警報”鍵的陣列中的每個物件添加以下鍵:
{
"bindType": "Tag",
"value": "[.]<parent.name>.Name"
}
在此示例中,“測驗警報”在哪里,<parent.name>它是警報陣列項的父項的“名稱”鍵。
到目前為止,我已經得到了這個添加物件的 jq 過濾器,但是value鍵值是錯誤的(它正在獲取警報陣列項的名稱而不是其父項的名稱):
walk( if type == "object" and .setpointA then .label = {"bindType":"Tag", "value": "[.]\(.name).Name"} else . end)
基本上我想要這個:
{
"valueSource": "memory",
"dataType": "Boolean",
"alarms": [
{
"setpointA": 1.0,
"name": "Alarm",
"priority": "Diagnostic",
"ackMode": "Auto",
"label": {
"bindType": "Tag",
"value": "[.]Test Alarm.Name"
}
}
],
"name": "Test Alarm",
"value": false,
"tagType": "AtomicTag"
}
下面是我的jqplay。它在 JSON 部分中有最終結果,其中 Result 應該與此匹配,但目前不匹配。

uj5u.com熱心網友回復:
您不能參考父級,您必須事先將參考保存在變數中,然后通過訪問該變數來下降。
.tags[] |= (
.name as $name
| # rest of your code using $name
walk(
if type == "object" and .setpointA
then .label = {"bindType":"Tag", "value": "[.]\($name).Name"}
else . end
)
)
演示
當您碰巧知道物件位于.alarms陣列中時,您也可以只迭代專案,select只有那些符合條件的專案,然后分配給他們.label想要的任何東西(包括$name)
.tags[] |= (
.name as $name
| (.alarms[] | select(has("setpointA"))).label = {
bindType: "Tag", value: "[.]\($name).Name"
}
)
演示
編輯回應OP的后續問題
我實際上并不關心
setpointA密鑰,我只想將label密鑰(以及另一個displayPath密鑰)添加到所有alarms陣列中的每個專案。
.tags[] |= (.name as $name | .alarms[] = (
{bindType: "Tag", value: "[.]\($name)."} | {
label: (.value = "Name"),
displayPath: (.value = "Documentation")
}
))
演示
uj5u.com熱心網友回復:
由于 jq 不允許您參考父物件,因此您需要在父級別上作業:
jq 'walk(if type == "object" and .alarms and ( .alarms | arrays )
then (.alarms[] | select(.setpointA)).label =
{ bindType: "Tag", value: "[.]\(.name).Name"}
else . end
)' data.json
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435529.html
上一篇:將json轉換為Avro,json中的欄位順序不一致
下一篇:為每個n元素打開新檔案
