使用jq将新元素添加到现有JSON数组

Fel*_*ipe 36 bash json jq

我有一个json文件,我想在其上附加一个新的对象数组.我正在尝试使用jq命令行.正如我在互联网上看到的那样,这个命令就是这样做的,不仅仅是对Json文件中的查询对象.但我无法弄清楚如何在jq上使用ADD命令.我的Json文件是report-2017-01-07.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"
         }
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令>>

$ 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
Run Code Online (Sandbox Code Playgroud)

我已经尝试过另一个命令组合,但我总是以错误编译结束.有什么暗示吗?谢谢!

输出必须看起来像>>

{
    "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"
        }]
    }
}
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 50

|= .+过滤器部分添加到现有阵列的新元素.您可以使用jqwith过滤器作为

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
Run Code Online (Sandbox Code Playgroud)

为避免使用硬编码长度值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
Run Code Online (Sandbox Code Playgroud)

(或)根据峰值在评论中的建议,+=仅使用运营商

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"}]'
Run Code Online (Sandbox Code Playgroud)

它可以根据需要生成输出.

{
  "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"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

使用jq-play来干燥运行jq-filter并优化您想要的任何方式.

  • 由于目标只是附加一个元素,因此最好使用 += 但值得注意的是 `.data.messages[3] |= 。+ X` 在这里可以简化为 `.data.messages[3] = X`,因为 RHS 上的 `.` 实际上只是 `null`。 (3认同)

pea*_*eak 29

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

.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"}]
Run Code Online (Sandbox Code Playgroud)

前置

另一方面,如果(如@NicHuang所说)您想要将JSON对象添加到数组的开头,则可以使用以下模式:

 .data.messages |= [ _ ] + .
Run Code Online (Sandbox Code Playgroud)

  • 前置示例: `echo '{"arr": [ "data1" ]}' | jq '.arr |= ["data2"] + .'` =&gt; `{"arr": ["data2", "data1"]}` (5认同)

pr-*_*pal 13

总结:“.+”是你的救星

细节:

将条目添加到列表:您可以附加 [list1] + [list2](而不是 [list] + data)

$ echo '[ "data1" ]' | jq '. + [ "data2" ]'
[
  "data1",
  "data2"
]

$ echo '[ {"key1": "value1"} ]' | jq '. + [{"key2": "value2"}]'
[
  {
    "key1": "value1"
  },
  {
    "key2": "value2"
  }
]
Run Code Online (Sandbox Code Playgroud)

将键/值添加到字典中:

$ echo '{"key1": "value1"}' | jq '. + {"key2": "value2"}'
{
  "key1": "value1",
  "key2": "value2"
}
Run Code Online (Sandbox Code Playgroud)

参考:

https://gist.github.com/joar/776b7d176196592ed5d8