首页 > 解决方案 > 逐个子元素查找元素并替换为子元素的值

问题描述

为了清楚起见,我有要转换为不同结构的结构的 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
                    )
                )'

但它不适用于内部元素。

标签: jsonjq

解决方案


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

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

jqplay.org 上的演示


推荐阅读