用JQ去除一层对象嵌套

removing one layer of object nesting with JQ

我一直在修改 JQ 以尝试操作一些数据。到目前为止,以下 JSON 使用我的命令输出:

 map({Row: .[] })
|   map(select(.Row.ganjalord.latitude | test("SOME_TESTING_CONDITION")?))

输入:

[
  {
    "Row": {
      "ganjalord": {
        "latitude": "56.237480",
        "temp": 44
      }
    },
    "fighter": "1"
  },
  {
    "Row": {
      "ganjalord": {
        "latitude": "53.237480",
        "temp": 42
      }
    },
    "fighter": "0"
  }
]

如何在不按行嵌套的情况下实现样本输出?

示例输出:

[
  {
    "ganjalord": {
      "latitude": "56.237480",
      "temp": 44
    },
    "fighter": "1"
  },
  {
    "ganjalord": {
      "latitude": "53.237480",
      "temp": 42
    },
    "fighter": "0"
  }
]

我是否使用简单的 select 语句来尝试实现此目的?

给定两个字典,* 运算符合并它们的内容。因此,

jq '[.[] | (. * .Row) | del(.Row)]'

...在给定您的输入时作为输出发出:

[
  {
    "fighter": "1",
    "ganjalord": {
      "latitude": "56.237480",
      "temp": 44
    }
  },
  {
    "fighter": "0",
    "ganjalord": {
      "latitude": "53.237480",
      "temp": 42
    }
  }
]

如图所示,将以下过滤器应用于 "input",会产生所需的结果:

map( with_entries( if .key == "Row" then .value|to_entries[] else . end) )

理解这一点的关键是 with_entries 首先应用 to_entries 产生 key/value 对,然后应用 from_entries.

当然,与基于 . * .Row. * Row(或 .+.Row.Row+.)的解决方案一样,上述解决方案将导致一些数据丢失,如果任何提升的键名与顶级键名一致。