2017-02-15 230 views
12

我有一个json文件,我想在其上追加一个新的对象数组。我正在尝试使用jq命令行。正如我在看互联网这个命令是这样做的,不仅在Json文件的查询对象。但我无法弄清楚如何在jq上使用ADD命令。 我的JSON文件是报告-2017-01-07.json >>使用jq向现有JSON数组添加新元素

{ 
    "report":"1.0", 
    "data":{ 
     "date":"2010-01-07", 
     "messages":[ 
     { 
      "date":"2010-01-07T19:58:42.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"OK", 
      "message":"metadata loaded into iRODS successfully" 
     }, 
     { 
      "date":"2010-01-07T20:22:46.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"NOK", 
      "message":"metadata duplicated into iRODS" 
     }, 
     { 
      "date":"2010-01-07T22:11:55.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"NOK", 
      "message":"metadata was not validated by XSD schema" 
     } 
     ] 
    } 
} 

我使用下面的命令>>

$ cat report-2017-01-07.json | jq -s '.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' 
jq: error: syntax error, unexpected '{', expecting $end (Unix shell quoting issues?) at <top-level>, line 1: 
.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}    
jq: 1 compile error 

我已经尝试过其他命令的组合,但我总是结束错误编译。有关于此的任何暗示? 谢谢!

输出必须像>>

{ 
    "report": "1.0", 
    "data": { 
     "date": "2010-01-07", 
     "messages": [{ 
      "date": "2010-01-07T19:58:42.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "OK", 
      "message": "metadata loaded into iRODS successfully" 
     }, { 
      "date": "2010-01-07T20:22:46.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "NOK", 
      "message": "metadata duplicated into iRODS" 
     }, { 
      "date": "2010-01-07T22:11:55.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "NOK", 
      "message": "metadata was not validated by XSD schema" 
     }, { 
      "date": "2010-01-07T19:55:99.999Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "OKKKKKKK", 
      "message": "metadata loaded into iRODS successfullyyyyy" 
     }] 
    } 
} 
+0

不知道这口井,但难道不是.data.messages是arrray的问题吗?所以你需要类似.data.messages的东西。[] –

+0

对不起,没有工作 –

+0

好吧 - 阅读文档并安装jq(在这里有Windows)并尝试 - 像你一样得到同样的错误。看起来像Windows shell有问题的方式,它将双引号输入到跳转jq的流中。无法获得任何工作,因此无法回答您的问题,但您可能需要查看jq命令中的双引号。所以''日期''会变成'\“日期\”等 –

回答

15

|= .+部分在过滤器增加了一个新元素添加到现有的阵列。可以用滤波器使用jq作为

jq '.data.messages[3] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson 

为了避免使用硬编码的长度值3并动态添加新的元件,用. | length它返回长度,其可以被用作下一个数组索引,即

jq '.data.messages[.data.messages| length] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson 

(或)按在评论中峰值的建议下,单独使用+=操作

jq '.data.messages += [{"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]' 

可根据您的需要生成输出。

{ 
    "report": "1.0", 
    "data": { 
    "date": "2010-01-07", 
    "messages": [ 
     { 
     "date": "2010-01-07T19:58:42.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "OK", 
     "message": "metadata loaded into iRODS successfully" 
     }, 
     { 
     "date": "2010-01-07T20:22:46.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "NOK", 
     "message": "metadata duplicated into iRODS" 
     }, 
     { 
     "date": "2010-01-07T22:11:55.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "NOK", 
     "message": "metadata was not validated by XSD schema" 
     }, 
     { 
     "date": "2010-01-07T19:55:99.999Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "OKKK", 
     "message": "metadata loaded into iRODS successfullyyyyy" 
     } 
    ] 
    } 
} 

使用jq-play干运行jq-filter和优化你想要的任何方式。

+0

由于目标只是追加一个元素,所以最好使用+ =,但值得注意的是'.data.messages [3] | =。 + X'可以简化为'.data.messages [3] = X',因为RHS上的'.'实际上只是'null'。 – peak

+0

(这里是Windows JQ用户):我想知道是否有可能将这个新数据写入同一个(输入)文件,而不是创建一个需要重新命名的临时文件.. –

+0

@ script'n'code - 使用“海绵”可能仍然是最好的选择,如果你有它或可以安装它(它是moreutils的一部分)。 – peak

12

而不是在这里使用|=,它是更好的使用+=

.data.messages += [{"date": "2010-01-07T19:55:99.999Z", 
    "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
    "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]