作为开发人员,当我使用以下JQ命令时:
.first_level."second_level"[] |= select(.fruit == "pear")
我将它应用于这个JSON:
{
"first_level": {
"second_level": [
{
"fruit": "apple"
},
{
"fruit": "pear"
},
{
"fruit": "banana"
},
{
"fruit": "donuts"
}
]
}
}然后,我希望有这个输出(只保留属性fruit与pear相等的项):
{
"first_level": {
"second_level": [
{
"fruit": "pear"
}
]
}
}但是返回的当前值是(也可以在JQ 这里中看到):
{
"first_level": {
"second_level": [
{
"fruit": "pear"
},
{
"fruit": "donuts"
}
]
}
}->它保留了donuts的值,我不明白的是,在JQ文档中,|=应该指定所选内容的值,但在运行时:
.first_level."second_level"[] \x{e76f}选择(.fruit == "pear")
我的结果如下:
{
"fruit": "pear"
}如果能在这个问题上提供任何帮助,我们将不胜感激。谢谢!)
发布于 2020-05-25 17:52:02
给定您的示例输入,该程序所做的基本工作如下:
.first_level.second_level |= (
delpaths([[0]]) # apple != pear
| delpaths([[1]]) # banana != pear
| delpaths([[2]]) # null != pear
| delpaths([[3]]) # null != pear
)查看|=的底层构建是如何实现这里的;当|=的右侧应用于路径的值时,如果结果是empty,则通过delpaths删除该路径。所以问题很明显,当.[0] (苹果)被删除时,.[1] (pear)变成了.[0];但是_modify没有考虑到这种变化,因为它在开始时会考虑要修改一次的路径列表,并且不会再次更新,并继续使用.[1] (香蕉)。
你可以用这个代替:
del(.first_level.second_level[] | select(.fruit != "pear"))或者如果您坚持一个涉及|=的解决方案
.first_level.second_level |= map(select(.fruit == "pear"))https://stackoverflow.com/questions/62007725
复制相似问题