我想使用JQ修改以下JSON输入:
{
"rows": [
{
"fields": [
{
"name": "id",
"value": "k1"
},
{
"name": "val",
"value": "2340378b211aa3d8f2d7607cbddce883b87b191d0425736641e3d308ea329718"
},
{
"name": "Encoding",
"value": "hex"
}
]
},
{
"fields": [
{
"name": "id",
"value": "k2"
},
{
"name": "val",
"value": "2340378b211aa3d8f2d7607cbddce883b87b191d0425736641e3d308ea329718"
},
{
"name": "Encoding",
"value": "hex"
}
]
}
]
}
这样,对于包含字段的行,名称为"hex"
的{{1}}字段的"value"
值仅修改为"Encoding"
与"oct"
。
我该怎么做?我可以.name=="id" and .value=="k1"
使用select
等字段,但我似乎无法找到“上升树”的方法来随后更新.value=="k1"
字段。
不能指望输入具有固定的字段/行顺序。
答案 0 :(得分:1)
使用any/2
会产生一个jq过滤器,该过滤器与英语中的问题描述非常匹配:
.rows |= map( if any(.fields[]; .name=="id" and .value=="k1")
then .fields |= map(if .name == "Encoding"
then .value = "oct"
else .
end)
else .
end )
如果我们使用如下定义的方便的通用功能,则可能会略微冗长且可能更清晰:
def when(filter; action): if (filter?) // null then action else . end;
我们可以简单地写一下:
.rows[] |= when( any(.fields[]; .name=="id" and .value=="k1");
.fields |= map( when (.name == "Encoding";
.value = "oct")))