剥离JSON元素并向其中添加一个新元素

时间:2019-01-08 12:55:04

标签: json shell jq

我正在尝试采用现有的JSON元素,并创建一个具有附加值的键的新元素。

我知道我可以使用许多其他工具来执行此操作,但我想知道仅凭jq是否可以实现

输入json文件:

{
  "entries": [
    {
      "uuid": "1a03",
      "enabled": true,
      "autoname": true,
      "name": "LBC",
      "number": 0,
      "epgauto": true,
      "epggrab": [],
      "dvr_pre_time": 0,
      "dvr_pst_time": 0,
      "epg_running": -1,
      "services": [
        "ea8"
      ],
      "tags": [
        "0a7"
      ],
      "bouquet": ""
    },
    {
      "uuid": "4a05",
      "enabled": true,
      "autoname": true,
      "name": "Radio X",
      "number": 0,
      "epgauto": true,
      "epggrab": [],
      "dvr_pre_time": 0,
      "dvr_pst_time": 0,
      "epg_running": -1,
      "services": [
        "9d36"
      ],
      "tags": [
        "08fa7"
      ],
      "bouquet": ""
    },...]
}

然后我为所需的对象过滤此对象,然后返回单个对象。

我尝试使用地图“ +”运算符添加值,但我认为我的语法可能是错误的

,但未成功

我正在使用它来过滤想要的对象

.entries[] | select(.uuid=="4a05")

如果我最终在uuid=4a05上进行过滤,我想创建以下输出

[{"tags":["08fa7","MYNEWVALUE"],"number":mynew##,"uuid":"4a05"}]

1 个答案:

答案 0 :(得分:1)

这是完成任务的一种方法-首先创建一个具有感兴趣字段的对象,然后更新.tags

.entries[]
| select(.uuid=="4a05") 
| {tags, uuid, number: "mynew##"}
| .tags += ["MYNEWVALUE"]