当前位置: 首页 > 面试题库 >

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

顾赞
2023-03-14
问题内容

我想使用命令将元素添加到JSON文件中的数组jq``add,但是不起作用。

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"
         }
      ]
   }
}

我正在使用此命令:

$ 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"
        }]
    }
}

问题答案:

|= .+过滤器中的部件将新元素添加到现有数组。您可以使用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并优化您想要的任何方式。



 类似资料:
  • 问题内容: 我有一个类似于以下代码的HTML构造: 我希望能够使用javascript和DOM向上面定义的SVG中添加一些元素。我将如何完成?我在想 我对使用DOM或如何创建要传递给appendChild的元素不是很熟悉,因此请帮助我解决这个问题,或者向我展示解决此问题的其他替代方法。非常感谢。 问题答案: 如果要创建HTML元素,请使用函数。SVG使用名称空间,这就是为什么必须使用函数的原因。

  • 问题内容: 我正在尝试将元素添加到python中的json文件中,但我无法做到这一点。 这是我直到现在尝试的内容(删除了一些变化): 但是,我得到的是: 很好,因为我还需要添加一个新行而不是一个元素,但是我想得到这样的东西: 我应该如何添加新元素? 问题答案: 你可以这样做。

  • 问题内容: 我正在尝试自动将新对象添加到现有json文件中。我在网上四处张望,却发现添加了数据和东西,但没有发现整个对象。这就是我要编辑的文件的外观: 我想去 谢谢您的所有答复,但我认为所有人都无法完全理解我的意思。我已经尝试了一些答案,但是后来我明白了: 我想在[]之间保持平衡。 问题答案: 如果使用json.NET,则可以简单地反序列化和序列化json。

  • 问题内容: 我有一个从JSON文件读取的JSON格式对象,该对象包含在一个名为teamJSON的变量中,如下所示: 我想向数组添加一个新项,例如 最后 在写回文件之前。什么是添加到新元素的好方法?我接近了,但是所有双引号都被转义了。我一直在寻找一个很好的答案,但是没有一个案例能解决这个问题。任何帮助表示赞赏。 问题答案: JSON 只是一种 表示法 ;进行所需的更改,以便可以将更改应用于本机 Ja

  • 问题内容: 我一直试图将onclick事件添加到使用JavaScript添加的新元素中。 问题是当我检查document.body.innerHTML时,我实际上可以看到onclick = alert(’blah’)已添加到新元素中。 但是,当我单击该元素时,我看不到警报框正在运行。实际上,任何与JavaScript相关的功能都无法正常工作。 这是我用来添加新元素的方法: 这是我所谓的函​​数:

  • 一、 我使用jlist来显示我的数据库数据。这个过程可以很好地从数据库中获取数据并显示在jlist元素中。我需要通过单击事件在jlist元素下显示我的数据。示例:包含用户名的Jlist,单击特定用户后,它应在Jlist元素下方显示该用户的属性。 如果有方法执行此过程,或者无法在特定jlist元素下显示,请建议我。 提前谢谢。