首页 > 解决方案 > 将具有另一个数组元素的 JSON 数组移动到相同的级别

问题描述

我有以下 JSON,它在另一个数组中有一个元素array_within_array 。所以我想使用jq将array_within_array元素和上层数组元素(event_array)拉到根级别。所以这里有3个事件。

  1. 餐点选择
  2. 登录
  3. 下单

事件placed_order在数组中有两个子事件。所以转换后应该有4个事件(1个来自meal_selection,1个来自login,2个来自placed_order)。这些都应该在同一水平上。这是JSON

{
    "region": "USA",
    "user_id": "123",
    "event_array": [{
            "event_attributes": {
                "date": "2021-08-17",
                "category": "lunch",
                "location": "office"
            },
            "event_name": "meal_selection",
            "created_at": "2021-08-13 01:28:57"
        },
        {
            "event_name": "login",
            "created_at": "2021-08-13 01:29:02"
        },
        {
            "event_attributes": {
                "array_within_array": [
                    {
                "date": "2021-08-17",
                "category": "lunch",
                "location": "office"
                    },
                    {
                "date": "2021-08-18",
                "category": "dinner",
                "location": "home"
                    }
                ]
            },
            "event_name": "placed_order",
            "created_at": "2021-08-13 01:28:08"
        }
        ]
}

我想转换成下面的

{
  "region": "USA",
  "user_id": "123",
  "event_attributes": {
    "date": "2021-08-17",
    "category": "lunch",
    "location": "office"
  },
  "event_name": "meal_selection",
  "created_at": "2021-08-13 01:28:57"
}
{
  "region": "USA",
  "user_id": "123",
  "event_name": "login",
  "created_at": "2021-08-13 01:29:02"
}
{
  "region": "USA",
  "user_id": "123",
  "event_attributes": {
    "date": "2021-08-17",
    "category": "lunch",
    "location": "office"
  },
  "event_name": "placed_order",
  "created_at": "2021-08-13 01:28:08"
}
{
  "region": "USA",
  "user_id": "123",
  "event_attributes": {
    "date": "2021-08-18",
    "category": "dinner",
    "location": "home"
  },
  "event_name": "placed_order",
  "created_at": "2021-08-13 01:28:08"
}

标签: jsonjq

解决方案


这是一个简单的解决方案,通过使用两个步骤使事情变得简单:

{ region, user_id} + (.event_array[] )
| if .event_attributes|has("array_within_array")
  then .event_attributes.array_within_array as $a
  | .event_attributes = $a[]
  else .
  end

推荐阅读