【问题标题】:jq: select without dropping items from arrayjq:选择而不从数组中删除项目
【发布时间】:2016-03-29 16:54:34
【问题描述】:

我有一个如下所示的 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?

【问题讨论】:

    标签: json jq


    【解决方案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")
        } // {}
    )'
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        以下内容可以满足您的要求,尽我所能理解您的 要求。

        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"
          }
        ]
        

        【讨论】:

          猜你喜欢
          • 2015-04-07
          • 1970-01-01
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 2021-11-06
          • 1970-01-01
          • 2016-09-30
          相关资源
          最近更新 更多