jq:选择不从数组中删除项目

时间:2016-03-29 16:54:34

标签: json jq

我有一个看起来像这样的JSON文件(一个粗略的架构):

[{
    "custom_variables": [
        {
            "name": "xxx",
            "value": "xxx"
        },
        {
            "name": "xxx",
            "value": "xxx"
        },
        {
            "name": "profile_id",
            "value": "123"
        }
    ],
    // many fields
    "xxx": "xxx",
    "xxx": "xxx",
    "xxx": "xxx"
}]

我正在使用jq从顶级对象中提取所有字段。 custom_variables字段构成一个具有名称和值的对象数组。

我想从custom_variables中提取一个特定对象,并给出其名称。

所以我正在做的是:

jq 'map(
    {
        xxx: .xxx, 
        xxx: .xxx, 
        xxx: .xxx, 
        xxx: .custom_variables | .[] | select(.name == "variable_name")
    } 
)'

它几乎可以工作;当它存在时,它获取我想要的变量,但是当它不存在时(或者如果custom_variables本身没有),它将删除整个顶级对象。所以最后我得到的对象越来越少,然后我就加入了剧本。

如果我找不到该字段但仍保留其余数据,我该如何才能返回null?

3 个答案:

答案 0 :(得分:1)

使用替代运算符(//)将零元素流(例如可以由select.[]生成的元素)转换为值:

jq 'map(
    {
        xxx: .xxx, 
        xxx: .xxx, 
        xxx: .xxx, 
        xxx: .custom_variables | .[] | select(.name == "variable_name") // null
    } 
)'

如果.xxx左侧有零元素流,则null//

当然,您可以将替代运算符放在不同的位置,以便在较早或较晚阶段捕获零元素流,例如在对象级别:

jq 'map(
    {
        xxx: .xxx, 
        xxx: .xxx, 
        xxx: .xxx, 
        xxx: .custom_variables | .[] | select(.name == "variable_name")
    } // {}
)'

答案 1 :(得分:0)

这很有效,但看起来很难看。有更好的解决方案吗?

custom_variables: (if (.custom_variables | length > 0) 
            then (.custom_variables | .[]? | select(.name == "variable_name") | .value | scan("\\d+"))
            else null
            end)

答案 2 :(得分:0)

以下内容符合您的要求,尽可能了解您的意见 要求。

map( if .custom_variables
     then .custom_variables |= (map(select(.name == "variable_name") | .value)
                                | .[0]) 
     else .
     end )

示例输入:

[{
    "custom_variables": [
        {
            "name": "xxx",
            "value": "xxx"
        },
        {
            "name": "xxx",
            "value": "xxx"
        },
        {
            "name": "variable_name",
            "value": "123"
        }
    ],
    "xxx1": "xxx",
    "xxx2": "xxx",
    "xxx3": "xxx"
},

{
    "yyy1": "yyy",
    "yyy2": "yyy",
    "yyy3": "yyy"
}
]

输出:

[
  {
    "custom_variables": "123",
    "xxx1": "xxx",
    "xxx2": "xxx",
    "xxx3": "xxx"
  },
  {
    "yyy1": "yyy",
    "yyy2": "yyy",
    "yyy3": "yyy"
  }
]