Заменить персонажа другим в ключах объекта - PullRequest
0 голосов
/ 25 апреля 2020

Я учусь использовать jq для манипулирования json данными, у меня с этим небольшие проблемы. Это мой ввод JSON

{
   "user":{
      "advertisingID":"617a68"
   },
   "deviceTs":1575387020137,
   "activies":[
       {
         "ts":1575617868326,
         "appsUsage":{
            "isFull":true,
            "data":[
               {
                  "com.orange.phone":44009
               }
            ],
            "startTs":1575617281541
         }
      },
      {
         "ts":1575618968326,
         "appsUsage":{
            "isFull":true,
            "data":[
               {
                  "uk.green.launcher2":4354
               },
               {
                  "com.black.phone":1232
               }
            ],
            "startTs":1575617281541
         }
      }
   ]
}

Я хочу заменить все ключи, содержащие "точки", на "тире" и ожидаемый результат:

{
   "user":{
      "advertisingID":"617a68"
   },
   "deviceTs":1575387020137,
   "activies":[
       {
         "ts":1575617868326,
         "appsUsage":{
            "isFull":true,
            "data":[
               {
                  "com-orange-phone":44009    <----
               }
            ],
            "startTs":1575617281541
         }
      },
      {
         "ts":1575618968326,
         "appsUsage":{
            "isFull":true,
            "data":[
               {
                  "uk-green-launcher2":4354   <----
               },
               {
                  "com-black-phone":1232      <----
               }
            ],
            "startTs":1575617281541
         }
      }
   ]
}

Я пробовал с .activies | = map (with_entries (если .key == "appsUsage" затем ... else. end)) ... (split (".") | join ("-")) но безуспешно, заранее спасибо.

1 Ответ

2 голосов
/ 25 апреля 2020

Я не думаю, что вам нужно регулярное выражение для этого; Я полагаю, что объединение встроенных сплинов и объединений будет более эффективным и чистым.

.activies |= walk(
  if type == "object" then
    reduce (keys_unsorted[] | select(index("."))) as $k (.;
      (.[$k | split(".") | join("-")] = .[$k])
      | del(.[$k])
    )
  else . end
)

Онлайн-демонстрация

По рекомендации пика, a более удобочитаемое решение:

.activies |= walk(
  if type == "object" then
    with_entries(
      .key |= gsub("\\.";"-")
    )
  else . end
)

Онлайн-демонстрация

...