使用JQ删除一层对象嵌套

时间:2018-06-20 14:23:33

标签: json bash unix jq unnest

我一直在修补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语句尝试实现这一目标?

2 个答案:

答案 0 :(得分:1)

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

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

...当输入时发出:

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

答案 1 :(得分:0)

将以下过滤器应用于“输入”,如图所示,将产生所需的结果:

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

了解这一点的关键是with_entries首先应用to_entries以产生键/值对,然后应用from_entries

当然,与基于. * .Row. * Row(或.+.Row.Row+.)的解决方案一样,如果存在以下任何一种情况,上述解决方案将导致数据丢失悬挂的键名与顶级键名重合。