用jq解析JSON数组

时间:2019-04-29 03:48:28

标签: bash jq

我需要使用jq从以下JSON示例中解析出特定信息。根据“仓库”,我需要能够从属性数组中解析所有“键”和“值”并与存储库相关联。例如,仓库“ libs-production-local”将需要解析字符串中带有“ prod”及其相关日期值的所有属性键。必须是jq并在.sh中运行。

{
   "results":[
      {
         "repo":"libs-production-local",
         "path":"com/company/version",
         "name":"sql.21.tar",
         "type":"file",
         "size":"40123",
         "created":"date",
         "created_by":"someone",
         "modified":"date",
         "modified_by":"someone",
         "updated":"date",
         "depth":4,
         "actual_md5":"asdflsdf23a4324234",
         "orginal_sha1":"sadlkfjsdklfjsadf",
         "properties":[
            {
               "key":"deploy.uat",
               "value":"2018-09-23"
            },
            {
               "key":"deploy.prod.TLE",
               "value":"2018-10-20"
            },
            {
               "key":"deploy.prodXYZ",
               "value":"2018-10-20"
            },
            {
               "key":"deploy.prodPDQ",
               "value":"2018-10-20"
            },
            {
               "key":"deploy.prod.ABC",
               "value":"2018-10-21"
            },
            {
               "key":"businessUnit.name",
               "value":"IndivdualName"
            },
            {
               "key":"deploy.qa.ser2",
               "value":"2018-10-20"
            },
            {
               "key":"deploy.qa.ser1",
               "value":"2018-11-23"
            },
            {
               "key":"build.timestamp",
               "value":"1510850899004"
            }
         ],
         "virtual_repos":[
            "libs-production "
         ]
      },
      {
         "repo":"libs-production-local",
         "path":"com/company/version",
         "name":"sql.22.tar",
         "type":"file",
         "size":"40123",
         "created":"date",
         "created_by":"someone",
         "modified":"date",
         "modified_by":"someone",
         "updated":"date",
         "depth":4,
         "actual_md5":"asdflsdf23a4324234",
         "orginal_sha1":"sadlkfjsdklfjsadf",
         "properties":[
            {
               "key":"deploy.prodPDQ",
               "value":"2018-10-22"
            },
            {
               "key":"deploy.prodABC",
               "value":"2018-10-20"
            },
            {
               "key":"businessUnit.name",
               "value":"IndivdualName"
            },
            {
               "key":"deploy.qa",
               "value":"2018-10-20"
            },
            {
               "key":"deploy.dev",
               "value":"2018-11-19"
            }
         ],
         "virtual_repos":[
            "libs-production "
         ]
      }
   ],
   "range":{
      "start_pos":0,
      "end_pos":479,
      "total":479
   }
}

我已经尝试了多种方法来做到这一点(包括该方法),但没有任何效果。

jq -r '.results[] |  ( .properties |map(select(.key[] contains ("prod")) '

2 个答案:

答案 0 :(得分:0)

我这样解决了:

DISTINCT

这将从每个结果的属性数组中获取所有键值对。然后,选择键中包含“ prod”的键,并返回这些键和值的数组。给定您从上面输入的示例,这是返回值:

jq -r '[ .results[].properties[] | select(.key | contains("prod")) ]'

与您要寻找的东西接近吗?

答案 1 :(得分:0)

还有,这是一种替代解决方案,基于JSON的步行路径Unix工具: jtc

bash $ <file.json jtc -w'[key]:<prod>R:[-1]' -j
[
   {
      "key": "deploy.prod.TLE",
      "value": "2018-10-20"
   },
   {
      "key": "deploy.prodXYZ",
      "value": "2018-10-20"
   },
   {
      "key": "deploy.prodPDQ",
      "value": "2018-10-20"
   },
   {
      "key": "deploy.prod.ABC",
      "value": "2018-10-21"
   },
   {
      "key": "deploy.prodPDQ",
      "value": "2018-10-22"
   },
   {
      "key": "deploy.prodABC",
      "value": "2018-10-20"
   }
]
bash $ 

PS>披露:我是jtc工具的创建者