2017-06-20 18 views
0

使用该JSON通过卷曲使用JQ抓住特定的关键:从第n个对象值对的JSON阵列

{ 
    "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun", 
    "actions" : [ 
     { 
      "_class" : "hudson.model.CauseAction", 
      "causes" : [ 
       { 
        "_class" : "jenkins.branch.BranchIndexingCause", 
        "shortDescription" : "Branch indexing" 
       } 
      ] 
     }, 
     { 
      "_class" : "hudson.model.ParametersAction", 
      "parameters" : [ "..." ] 
     }, 
     { 
      "_class" : "hudson.tasks.junit.TestResultAction", 
      "failCount" : 1, 
      "skipCount" : 14, 
      "totalCount" : 222, 
      "urlName" : "testReport" 
     } 
    ], 
    "artifacts" : [ "..." ], 
    "result" : "UNSTABLE", 
    "previousBuild" : { 
     "number" : 98, 
     "url" : "<some Url>" 
    } 
} 

从詹金斯建立API调用采取为什么我能做到jq '{result}' <fileNameWithJSON>并获得

{ "result" : "UNSTABLE" } 

但我不能做jq '{.actions[2] failCount}' <fileNameWithJSON>或其他变化,如

  • jq '{actions[2].failCount}'
  • jq '{actions[2] failCount}'
  • jq '{actions .[2].failCount}'
  • 得到{ "failCount" : "1" }

我要抢result,以及actions[2] failCountactions[2] skipCountactions[2] totalCount创建一个新的JSON这样的:

{ "result" : "UNSTABLE","failCount" : 1, "skipCount" : 14,"totalCount" : 222} 

编辑:

我的目标是不必须重新指定密钥,以防其在api中更改。我基本上不想这样:

{result, "failCount":.actions[2].failCount, "skipCount":.actions[2].skipCount, "totalCount": .actions[2].totalCount} 

回答

3

jq只能将直接字段从一个对象复制到另一个对象字面值。虽然在支持这种功能的其他语言中肯定是可行的,但它并没有被编程得更深入。

如果你的目标是最大限度地减少属性名称的重复,你只需要重写过滤器。

{result} + (.actions[2] | {failCount,skipCount,totalCount}) 
+0

这实质上是我正在寻找的最接近的东西。我不希望再次指定键,如下所示:'{result,“failCount”:.actions [2] .failCount,“skipCount”:.actions [2] .skipCount,“totalCount”: .actions [2] .totalCount}'。我想从api本身拉出来,所以如果api由于某种原因而改变,我不需要做出关键的改变。谢谢。 – Wimateeka

0

{}语法是糖。当你需要一个简单的表达式时,它的目的是作为一种快捷方式,但是当你真正想要的更有趣时,没有理由使用相同的缩短语法。

jq ' 
    .actions[2] as $a2 |    # assign second action to a variable 
    { "result": .result,    # refer direct to original input when appropriate... 
    "skipCount": $a2.skipCount,  # ...or to that variable otherwise. 
    "failCount": $a2.failCount, 
    "totalCount": $a2.totalCount} 
' <<<"$json" 
0

我的目标是不是要重新指定的情况下,他们在API改变的关键。

如果是的主要目标之一,你可能要考虑以下,这也使得不能假定其中.actions元素包含感兴趣的信息举例的方法:

{ result } + (.actions[] | select(has("failCount"))) 

有了您的数据。例如,这将产生:

{ 
    "result": "UNSTABLE", 
    "_class": "hudson.tasks.junit.TestResultAction", 
    "failCount": 1, 
    "skipCount": 14, 
    "totalCount": 222, 
    "urlName": "testReport" 
} 

如果你不想要一些额外的字段,你可以删除它们,例如,如果您绝对不想要“_class”,则可以将del(._class)添加到管道中。