【问题标题】:Get parent element id while parsing json data with jq使用jq解析json数据时获取父元素id
【发布时间】:2018-07-05 06:22:12
【问题描述】:

当子元素值为client_release时,我想从JSON数据中打印父元素的ID。

如果 data.properties.value== "client_release"

那么输出应该是

abcd1g2f,hirk5d7b3l

我在下面尝试过,但没有运气

jq '.data[].properties[]|select(.value=="client_release")|.id'

JSON 数据如下:

{  
   "data":[  
      {  
         "id":"abcd1g2f",
         "resourceURI":"https://somerepo.com/service/local/privileges/abcd1g2f",
         "name":"release1",
         "description":"release1",
         "type":"target",
         "userManaged":true,
         "properties":[  
            {  
               "key":"repositoryGroupId",
               "value":""
            },
            {  
               "key":"method",
               "value":"create,read"
            },
            {  
               "key":"repositoryId",
               "value":"client_release"
            },
            {  
               "key":"repositoryTargetId",
               "value":"1"
            }
         ]
      },
      {  
         "id":"asdf1k4g",
         "resourceURI":"https://somerepo.com/service/local/privileges/asdf1k4g",
         "name":"release2",
         "description":"release2",
         "type":"target",
         "userManaged":true,
         "properties":[  
            {  
               "key":"repositoryGroupId",
               "value":""
            },
            {  
               "key":"method",
               "value":"read"
            },
            {  
               "key":"repositoryId",
               "value":"formal_release"
            },
            {  
               "key":"repositoryTargetId",
               "value":"1"
            }
         ]
      },
      {  
         "id":"hirk5d7b3l",
         "resourceURI":"https://somerepo.com/service/local/privileges/hirk5d7b3l",
         "name":"release3",
         "description":"release3",
         "type":"target",
         "userManaged":true,
         "properties":[  
            {  
               "key":"repositoryGroupId",
               "value":""
            },
            {  
               "key":"method",
               "value":"create,read"
            },
            {  
               "key":"repositoryId",
               "value":"client_release"
            },
            {  
               "key":"repositoryTargetId",
               "value":"1"
            }
         ]
      }
   ]
}

【问题讨论】:

    标签: json jq


    【解决方案1】:

    想法是对的,但是data[]数组应该在select语句之外,

    jq '.data[] | select(.properties[].value == "client_release") | .id'
    

    如问题所示,要将其放入 CSV 格式,请将结果放入数组并使用 @csv 构造

    jq --raw-output '[.data[] | select(.properties[].value == "client_release") | .id] | @csv'
    

    【讨论】:

      【解决方案2】:

      以下过滤器避免了重复,并且可能比使用 select(.properties[].value ...) 更有效:

      .data
      | map(select(.properties | any(.[]; .value == "client_release")) | .id)
      | join(",")
      

      (如果您希望 .id 的值作为 JSON 字符串,您也可以在末尾使用 @csv。)

      "repositoryId"

      如果只关注“repositoryId”对应的值,那么你可以 使用from_entries,例如:

      .data
      | map(select(.properties | from_entries.repositoryId == "client_release") | .id)
      | join(",")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        相关资源
        最近更新 更多