Изменить форму JSON с помощью JQ

#json #nested #key #jq

#json #вложенный #Клавиша #jq

Вопрос:

Я пытаюсь изменить форму файла JSON с помощью JQ, и, похоже, я не могу найти правильный способ сделать это.

По сути, я пытаюсь превратить некоторые ключи в значения и реорганизовать некоторые части JSON.

Исходный JSON выглядит следующим образом :

 {
  "ABCC": {
    "pairs": {
      "CND": {
        "tsyms": {
          "BTC": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "ETH": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      },
      "ELF": {
        "tsyms": {
          "ETH": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "BTC": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      }
    }
  },
  "ACX": {
    "pairs": {
      "PLA": {
        "tsyms": {
          "AUD": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "USDT": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      },
      "BTC": {
        "tsyms": {
          "USDT": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          },
          "AUD": {
            "useless_variable1": "useless_value1",
            "useless_variable2": "useless_value2"
          }
        }
      }
    }
  }
}
 

И ожидаемый результат JSON будет примерно таким :

 {
  "ABCC": {
    "pairs": [
      "CND/BTC",
      "CND/ETH",
      "ELF/ETH",
      "ELF/BTC"
    ]
  },
  "ACX": {
    "pairs": [
      "PLA/AUD",
      "PLA/USDT",
      "BTC/USDT",
      "BTC/AUD"
    ]
  }
}
 

Есть идеи, как я мог бы достичь этого результата?

Спасибо!

Ответ №1:

Ключом к простому решению является написание вспомогательной функции для извлечения ключа / ключевых строк:

 # emit a stream of key1/key3 strings
def pairs:
  keys_unsorted[] as $k1
  | .[$k1][]
  | keys_unsorted[] as $k3
  | "($k1)/($k3)";
 

Теперь, благодаря |= оператору jq, решение может быть записано просто как:

 map_values(.pairs |= [pairs])