按子元素查找元素并替换为子元素的值

时间:2020-05-17 16:52:55

标签: json jq

为了清楚起见,我具有要转换为其他结构的结构的JSON数组。

[
  {
    "a": 1,
    "b": 2,
    "c": {
      "d": 3
    },
    "e": {
      "f": 4,
      "g": {
        "d": 8
      }
    }
  },
  {
    "a": 5,
    "b": 6,
    "c": {
      "d": 7
    }
  },
  {
    "a": 9,
    "b": 10,
    "c": {
      "d": 11
    },
    "e": {
      "f": 12,
      "g": {
        "d": 13
      }
    }
  }
]

我想将其转换为:

[
  {
    "a": 1,
    "b": 2,
    "c": 3,
    "e": {
      "f": 4,
      "g": 8
    }
  },
  {
    "a": 5,
    "b": 6,
    "c": 7
  },
  {
    "a": 9,
    "b": 10,
    "c": 11,
    "e": {
      "f": 12,
      "g: 13
    }
  }
]

所以每个元素都是形式:

"c": {
    "d": 3
}

我想转换为:

"c": 3

可以确保JSON在根对象中不包含'd'元素。

我尝试了

jq  \
            'map(
                with_entries(
                    .value = if .value."$oid" ? then "ObjectId(" + .value."$oid"+ ")" else .value end
                    )
                )'

但不适用于内部元素。

1 个答案:

答案 0 :(得分:2)

稍作调整,在他的评论中张贴的@ hek2mgl链接上的可接受答案就可以满足您的情况。

walk(if type == "object" and keys_unsorted == ["d"] then .d else . end)

demo at jqplay.org